基础
Flask 是一个轻量级的 Python Web 框架,以简单、灵活、易用著称。它适合小型项目或原型开发,但也能扩展用于生产环境。下面将详细介绍 Flask 的概念及具体操作。
1. Flask 概念¶
1.1 WSGI 和 Flask¶
- WSGI(Web Server Gateway Interface) 是 Python 应用和 Web 服务器之间的接口标准。Flask 基于 WSGI,使得它能与各种 Web 服务器兼容。
- Flask 是一个 WSGI 应用框架,提供路由、请求处理、模板渲染等基本功能。
1.2 路由和视图函数¶
- 路由(Routing):将 URL 映射到特定的视图函数(View Function)。
- 视图函数:处理请求并返回响应内容的函数。
1.3 模板(Templates)¶
- Flask 使用 Jinja2 作为模板引擎,允许在 HTML 文件中嵌入 Python 表达式,实现动态内容渲染。
1.4 请求和响应¶
- 请求:Flask 提供了
request
对象,包含了 HTTP 请求的所有信息。 - 响应:视图函数返回的内容就是 HTTP 响应,可以是字符串、JSON、模板渲染结果等。
1.5 中间件(Middleware)¶
- 中间件是一个可以在请求处理前后执行额外逻辑的组件,通常用于日志记录、权限验证等。
2. 快速上手:构建一个简单的 Flask 应用¶
2.1 安装 Flask¶
首先,需要安装 Flask。
2.2 创建一个简单的 Flask 应用¶
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run()
Flask(__name__)
创建了一个 Flask 应用实例。@app.route('/')
装饰器将根路径/
映射到hello_world
视图函数。app.run()
启动应用服务器。
运行代码后,访问 http://127.0.0.1:5000/
,你会看到 Hello, World!
的输出。
2.3 路由和路径参数¶
可以通过路径参数实现动态 URL。
<username>
是路径参数,Flask 会自动将 URL 中的部分传递给视图函数。
访问 http://127.0.0.1:5000/user/Alice
,你会看到 User Alice
的输出。
2.4 模板渲染¶
Flask 使用 Jinja2 渲染 HTML 模板。
from flask import render_template
@app.route('/hello/<name>')
def hello(name):
return render_template('hello.html', name=name)
在 templates
目录下创建 hello.html
:
<!doctype html>
<html>
<head>
<title>Hello</title>
</head>
<body>
<h1>Hello, {{ name }}!</h1>
</body>
</html>
访问 http://127.0.0.1:5000/hello/Alice
,将渲染出包含 Hello, Alice!
的 HTML 页面。
2.5 处理表单数据¶
Flask 提供了简单的方法来处理表单提交的数据。
from flask import request
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
return f'Logged in as {username}'
return '''
<form method="post">
Username: <input type="text" name="username"><br>
<input type="submit" value="Login">
</form>
'''
request.form
访问表单数据。- 使用
methods=['GET', 'POST']
指定路由支持的 HTTP 方法。
2.6 静态文件¶
Flask 默认将 static
目录中的文件作为静态文件。
- 使用
url_for('static', filename='style.css')
生成静态文件的 URL。
3. 中间件和扩展¶
3.1 中间件¶
中间件在请求前后执行特定操作,例如请求日志记录。
@app.before_request
def before_request_func():
print("This is executed BEFORE each request.")
@app.after_request
def after_request_func(response):
print("This is executed AFTER each request.")
return response
3.2 使用 Flask 扩展¶
Flask 提供了丰富的扩展,例如数据库支持、用户认证等。以下是 Flask-SQLAlchemy 的示例:
from flask_sqlalchemy import SQLAlchemy
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db'
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
db.create_all()
SQLAlchemy
是一个 ORM 库,提供了数据库操作的高级接口。
4. 部署 Flask 应用¶
4.1 使用 Gunicorn 部署¶
-w 4
指定使用 4 个工作进程。
4.2 使用 Docker 部署¶
创建一个 Dockerfile:
FROM python:3.8-slim
WORKDIR /app
COPY . /app
RUN pip install -r requirements.txt
CMD ["gunicorn", "-w", "4", "myapp:app"]
然后使用 docker build
和 docker run
来构建和运行容器化的 Flask 应用。
5. Flask 与其他框架对比¶
- 轻量 vs. 重量:Flask 是一个微框架,灵活性强,而 Django 是一个全栈框架,内置了很多功能。
- 扩展性:Flask 的功能依赖于扩展,开发者可以自由选择需要的功能。
总结¶
Flask 是一个简单易用的 Web 框架,适合快速构建小型 Web 应用或原型。通过路由、模板、表单处理和中间件等功能,可以快速构建功能完善的 Web 应用。Flask 的扩展性强,能够满足多种需求,同时其轻量级的特性使得它在小型项目中非常受欢迎。