1. 简介与特点
-
微框架: 核心简单,高度可扩展,不强制使用特定工具或库。
-
优点:
- 学习曲线平缓: 易于上手,适合小型项目和快速开发。
- 灵活性高: 开发者可以自由选择组件和技术栈。
- 社区活跃: 拥有丰富的第三方扩展和活跃的社区支持。
- 适用于API开发: 轻量级使其非常适合构建 RESTful API。
-
缺点:
- 功能较少: 核心功能仅包含请求分发和模板渲染,其他需自行集成。
- 不适合大型项目?: 对于非常大型、复杂且有明确规范的项目,可能需要更多约定和内置功能的框架(如 Django)。
2. 基本应用结构
一个最简单的 Flask 应用:
from flask import Flask
# 1. 创建 Flask 应用实例
app = Flask(__name__)
# 2. 路由定义 (URL 映射到视图函数)
@app.route('/')
def hello_world():
return 'Hello, World!'
# 3. 运行应用
if __name__ == '__main__':
# 开启调试模式,代码修改后自动重启,并提供交互式调试器
app.run(debug=True)
3. 核心概念
-
Flask
实例 (app = Flask(__name__)
)Flask
类是所有 Flask 应用的入口。__name__
参数是当前模块的名称,Flask 用它来定位资源(如模板、静态文件)。
-
路由 (Routing)
-
使用
@app.route(rule, options)
装饰器将 URL 路径与视图函数关联起来。 -
rule
: URL 规则字符串,支持变量。 -
URL 变量:
<variable_name>
用于捕获 URL 中的值。@app.route('/user/<username>')
@app.route('/post/<int:post_id>')
(指定类型,如string
,int
,float
,path
,uuid
)
-
HTTP 方法限制:
methods=['GET', 'POST']
@app.route('/submit', methods=['POST'])
-
URL 反转:
url_for()
函数根据视图函数名和参数生成 URL。url_for('hello_world')
->/
url_for('get_user', username='alice')
->/user/alice
- 用于避免硬编码 URL,方便修改和维护。
-
-
请求上下文 (Request Context)
-
在每次请求到达时创建,包含请求相关的所有信息。
-
request
对象: 包含客户端发送的所有数据。request.method
: 请求方法 (GET, POST等)request.args
: GET 请求的查询参数 (ImmutableMultiDict)request.form
: POST 请求的表单数据 (ImmutableMultiDict)request.json
: POST 请求的 JSON 数据 (如果Content-Type是application/json)request.headers
: 请求头request.cookies
: 客户端的 Cookierequest.files
: 上传的文件request.path
,request.url
,request.base_url
等
-
session
对象: 用户会话信息,用于在请求之间存储数据。- 需要设置
app.secret_key
来加密会话数据。 session['user_id'] = 1
- 需要设置
-
-
应用上下文 (Application Context)
- 在应用启动时创建,包含应用相关的配置信息。
current_app
对象: 代理当前的 Flask 应用实例。
-
响应 (Response)
-
视图函数可以返回:
-
字符串: Flask 会自动将其包装为 Response 对象,Content-Type为
text/html
。 -
元组:
(response, status_code, headers)
return 'Error!', 400
return 'Custom Header', 200, {'X-My-Header': 'Hello'}
-
Response
对象:make_response()
函数创建。 -
jsonify()
: 将 Python 字典或列表转换为 JSON 响应,并自动设置Content-Type: application/json
。
-
-
4. 模板渲染 (Templating)
-
Flask 默认使用 Jinja2 模板引擎。
-
render_template(template_name, **context)
:- 在
templates
文件夹中查找模板文件。 template_name
: 模板文件的路径(相对于templates
文件夹)。**context
: 传递给模板的变量。
- 在
-
Jinja2 语法:
{{ variable }}
: 输出变量值。{% statement %}
: 执行控制语句(如for
循环,if
条件)。{# comment #}
: 注释。{% extends 'base.html' %}
: 模板继承。{% block content %}{% endblock %}
: 定义块。
-
静态文件:
- 在
static
文件夹中存放 CSS, JS, 图片等文件。 - 在模板中使用
url_for('static', filename='css/style.css')
来引用。
- 在
5. 错误处理 (Error Handling)
-
使用
@app.errorhandler(code_or_exception)
装饰器来注册错误处理器。 -
可以捕获 HTTP 状态码(如 404, 500)或特定的异常。
@app.errorhandler(404)
def page_not_found(error):
return render_template('404.html'), 404@app.errorhandler(Exception) # 捕获所有未处理的异常
def handle_exception(e):
# log the error
return 'Internal Server Error', 500
6. 调试模式 (Debug Mode)
-
app.run(debug=True)
。 -
功能:
- 自动重载: 代码修改后自动重启。
- 交互式调试器: 发生错误时在浏览器中提供调试界面。
- 禁用缓存: 确保模板是最新的。
-
注意: 严禁在生产环境中使用
debug=True
。
7. 配置 (Configuration)
-
app.config
对象: 存储应用配置。 -
设置配置:
-
直接赋值:
app.config['SECRET_KEY'] = 'your_secret_key'
-
from_object()
: 从 Python 对象加载配置。# config.py class Config: DEBUG = False SECRET_KEY = 'another_secret_key' # app.py app.config.from_object('config.Config')
-
from_envvar()
: 从环境变量加载配置文件路径。 -
from_pyfile()
: 从 Python 文件加载配置。
-
-
常用配置项:
SECRET_KEY
: 用于会话加密、CSRF 保护等,非常重要。DEBUG
: 调试模式。TEMPLATES_AUTO_RELOAD
: 控制模板是否自动重载(默认为None,在DEBUG模式下为True)。MAX_CONTENT_LENGTH
: 限制请求体的最大大小(用于文件上传)。
8. 蓝图 (Blueprints)
-
用于组织大型应用、模块化代码。
-
将相关的视图函数、模板、静态文件等注册到一个蓝图上,然后将蓝图注册到应用实例上。
-
优点:
-
模块化: 将应用拆分成更小的、可管理的组件。
-
可复用性: 蓝图可以注册到多个应用实例。
-
URL 前缀: 可以为蓝图中的所有路由添加统一的 URL 前缀。
-
子域名: 蓝图可以关联到特定的子域名。
users/views.py
from flask import Blueprint
users_bp = Blueprint('users', name, url_prefix='/users')
@users_bp.route('/')
def index():
return 'User List'@users_bp.route('/int:user_id')
def user_profile(user_id):
return f'User ID: {user_id}'app.py
from flask import Flask
from users.views import users_bpapp = Flask(name)
app.register_blueprint(users_bp) # 注册蓝图访问 /users/ 或 /users/123
-
9. Hook 函数 (钩子函数)
- 在请求处理的不同阶段执行特定功能的函数。
@app.before_request
: 请求进入视图函数之前执行。@app.after_request
: 视图函数执行并生成响应后执行。@app.teardown_request
: 请求结束后执行,无论是否发生异常。@app.before_first_request
: 第一个请求到达时执行一次。
10. 扩展 (Extensions)
-
Flask 本身很精简,但有大量的第三方扩展来提供额外功能。
-
常见扩展:
- Flask-SQLAlchemy: ORM (对象关系映射) 库,用于数据库操作。
- Flask-Migrate: 数据库迁移工具。
- Flask-WTF: 表单处理和 CSRF 保护。
- Flask-Login: 用户会话管理和认证。
- Flask-RESTful / Flask-RESTX: 构建 RESTful API。
- Flask-Mail: 邮件发送。
- Flask-Bcrypt: 密码哈希。
- Flask-CORS: 跨域资源共享。
11. 部署 (Deployment)
-
开发服务器:
app.run()
仅用于开发和测试。 -
生产环境:
-
需要使用生产级的 WSGI 服务器,如 Gunicorn 、uWSGI。
-
将 Flask 应用作为 WSGI 可调用对象运行。
-
通常会结合 Nginx (作为反向代理和静态文件服务) 使用。
-
示例 (
wsgi.py
):from yourapplication import app as application # 假设你的Flask应用实例叫app,在yourapplication模块中 if __name__ == '__main__': application.run()
-
运行 Gunicorn:
gunicorn -w 4 wsgi:application
(4个 worker 进程)
-