Flask 是一款轻量级 Python Web 框架,以 “微框架” 为设计理念,核心仅保留路由、模板引擎等基础功能,其余功能通过扩展实现。其流程设计简洁高效,既适合快速开发小型应用,也能通过扩展支撑复杂系统,是 Python Web 开发的重要工具之一。
一、Flask 环境搭建与项目初始化
在了解流程前,需先完成环境准备与项目初始化,这是后续开发的基础,也是流程的起点。
1. 环境搭建(核心步骤)
Flask 依赖 Python 环境(推荐 3.7+),为避免依赖冲突,需先创建虚拟环境,再安装 Flask:
创建虚拟环境:通过 Python 内置的 模块创建隔离环境
venv
Windows 命令:macOS/Linux 命令:
python -m venv flask_env 激活虚拟环境:
python3 -m venv flask_env
Windows(cmd):Windows(PowerShell):
flask_envScriptsactivate.batmacOS/Linux:
.flask_envScriptsActivate.ps1 安装 Flask:激活后执行
source flask_env/bin/activate,默认安装最新稳定版(截至 2024 年 5 月,最新版为 2.3.x)。
pip install flask
2. 最小项目初始化
Flask 对项目结构无强制要求,最小项目仅需 1 个 Python 文件(如 ),代码如下:
app.py
# 1. 导入 Flask 核心类
from flask import Flask
# 2. 初始化 Flask 应用实例
# __name__ 表示当前模块名,Flask 会据此查找模板、静态文件路径
app = Flask(__name__)
# 3. 定义路由与视图函数(核心关联)
@app.route('/') # 绑定 URL 路径“/”(首页)
def index(): # 视图函数:处理该路径的请求,返回响应
return "Hello, Flask!" # 返回字符串作为响应内容
# 4. 启动开发服务器
if __name__ == '__main__':
# debug=True:开启调试模式(代码修改后自动重启,显示错误详情)
app.run(debug=True)
运行 后,访问
python app.py,即可看到 “Hello, Flask!”,标志项目初始化成功。
http://127.0.0.1:5000
二、Flask 核心工作流程(请求 – 响应循环)
Flask 的核心流程是 “请求 – 响应循环”:用户发送 HTTP 请求 → Flask 处理请求 → 返回 HTTP 响应。整个过程可拆解为 7 个关键步骤,涉及应用实例、路由、视图函数、请求上下文等核心组件。
步骤 1:启动开发服务器,监听请求
执行 后,Flask 会启动内置开发服务器(基于 Werkzeug 库),默认监听
app.run()(localhost 的 5000 端口)。此时服务器处于 “等待状态”,随时接收客户端(如浏览器)发送的 HTTP 请求(如 GET、POST 请求)。
127.0.0.1:5000
注意:内置服务器仅用于开发环境,生产环境需使用 Gunicorn、uWSGI 等专业服务器。
步骤 2:接收请求,解析 HTTP 信息
当用户在浏览器输入 并回车时,浏览器会发送 HTTP GET 请求,Flask 服务器接收后,首先解析请求中的核心信息:
http://127.0.0.1:5000/user
请求方法:GET(或 POST、PUT、DELETE 等)请求路径:(用于匹配路由)请求参数:如
/user(URL 中的查询参数)请求头:如 User-Agent(浏览器标识)、Cookie 等请求体:如 POST 请求中提交的表单数据、JSON 数据
?id=123
步骤 3:匹配路由,找到对应的视图函数
Flask 内部维护一个 “路由表”,存储 URL 路径与视图函数的映射关系(通过 装饰器注册)。例如:
@app.route
# 路由表中的映射关系
"/" → index() # 首页路径对应 index 函数
"/user" → get_user() # /user 路径对应 get_user 函数
"/user/<int:user_id>" → get_user_detail(user_id) # 带参数的路由
服务器解析出请求路径(如 )后,会遍历路由表,根据 “路径 + 请求方法” 匹配对应的视图函数。若未找到匹配的路由(如访问
/user),则返回 404 Not Found 错误。
/invalid
路由匹配规则:支持静态路径(如
)、动态参数(如
/about,参数类型可指定为
/user/<user_id>、
int等)、通配符(如
string)。
/article/*
步骤 4:创建请求上下文,传递请求数据
找到视图函数后,Flask 不会直接执行函数,而是先创建 请求上下文(Request Context),将请求相关的数据封装到 对象中,供视图函数调用。例如:
flask.request
:获取请求方法(如 “GET”)
request.method:获取 URL 查询参数(如
request.args 取
request.args.get("id") 中的 123)
?id=123:获取 POST 表单数据(如
request.form)
request.form.get("username"):获取 POST 请求中的 JSON 数据(如
request.json)
request.json.get("age")
请求上下文的作用是 “解耦”—— 视图函数无需通过参数接收请求数据,直接通过 对象获取,简化代码逻辑。
request
步骤 5:执行视图函数,处理业务逻辑
视图函数是 Flask 处理业务逻辑的核心,需完成 “接收请求数据 → 处理业务 → 生成响应数据” 的核心任务。例如,一个获取用户详情的视图函数:
from flask import request, jsonify
@app.route('/user/<int:user_id>', methods=['GET']) # 仅允许 GET 请求
def get_user_detail(user_id):
# 1. 接收请求数据:路由参数 user_id(从 URL 中提取)
# 2. 处理业务逻辑:模拟从数据库查询用户(实际项目中会连接 MySQL、MongoDB 等)
user_data = {
"user_id": user_id,
"username": "flask_user",
"email": "user@flask.com"
}
# 3. 生成响应数据:返回 JSON 格式(使用 jsonify 函数,自动设置响应头 Content-Type: application/json)
return jsonify(user_data)
视图函数的处理逻辑可灵活扩展:
数据交互:调用数据库(如用 SQLAlchemy 扩展操作 MySQL)、调用外部 API(如用 requests 库)权限校验:检查用户是否登录(如用 Flask-Login 扩展)数据验证:校验请求参数合法性(如用 Flask-WTF 扩展)
步骤 6:生成 HTTP 响应,封装响应信息
视图函数执行完成后,会返回 “响应数据”(如字符串、 对象、
jsonify 模板渲染结果等),Flask 会将其封装为 HTTP 响应对象(flask.Response),包含三部分核心信息:
render_template
响应状态码:默认 200 OK(成功),可手动指定(如 表示 400 Bad Request)响应头:如
return "Error", 400(响应内容类型,字符串默认
Content-Type,JSON 默认
text/html)、
application/json(设置 Cookie)响应体:视图函数返回的内容(如 HTML 页面、JSON 字符串、图片二进制数据等)
Set-Cookie
例如, 会生成如下响应:
return jsonify(user_data)
状态码:200 OK响应头:响应体:
Content-Type: application/json
{"user_id": 123, "username": "flask_user", "email": "user@flask.com"}
步骤 7:发送响应,释放请求上下文
Flask 将响应对象发送给客户端(浏览器),浏览器接收后解析响应体,展示内容(如渲染 HTML 页面、显示 JSON 数据)。
响应发送完成后,Flask 会 释放请求上下文,清除本次请求的 对象数据,避免内存泄漏,为下一次请求做好准备。
request
三、Flask 核心扩展与流程增强
Flask 核心流程仅覆盖 “请求 – 响应” 的基础逻辑,实际项目中需通过 扩展 增强功能,常见扩展及对流程的补充如下:
| 扩展名称 | 核心功能 | 对流程的补充作用 |
|---|---|---|
| Flask-SQLAlchemy | 数据库 ORM 工具 | 在视图函数中简化数据库操作(如查询、插入数据) |
| Flask-WTF | 表单验证与 CSRF 保护 | 在 “请求处理” 阶段验证表单数据,防止跨站请求伪造 |
| Flask-Login | 用户认证与会话管理 | 在 “路由匹配” 后校验用户登录状态,保护私密路由 |
| Flask-JWT-Extended | JWT 认证 | 支持 Token 登录,在 “请求解析” 阶段验证 Token 合法性 |
| Flask-Migrate | 数据库迁移工具 | 管理数据库表结构变更,不直接影响请求 – 响应流程 |
以 Flask-SQLAlchemy 为例,扩展后的流程会在 “视图函数执行” 阶段增加数据库交互:
初始化扩展:在 中配置数据库并初始化
app.py
from flask_sqlalchemy import SQLAlchemy
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db' # SQLite 数据库路径
db = SQLAlchemy(app) # 初始化数据库实例
定义模型:创建 User 表映射类
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
视图函数中操作数据库:
@app.route('/add_user', methods=['POST'])
def add_user():
username = request.form.get("username")
# 插入数据到数据库
new_user = User(username=username)
db.session.add(new_user)
db.session.commit() # 提交事务
return "User added successfully", 201 # 201 Created 状态码
四、Flask 模板渲染与静态文件流程
除了返回 JSON / 字符串,Flask 还支持渲染 HTML 模板(通过 Jinja2 模板引擎),并加载 CSS、JS、图片等静态文件,这是构建动态网页的核心流程。
1. 模板渲染流程
Flask 约定模板文件放在项目根目录的 文件夹中,渲染流程如下:
templates
创建模板文件:在 中新建
templates
index.html
<!-- templates/index.html -->
<!DOCTYPE html>
<html>
<body>
<h1>Hello, {{ username }}!</h1> <!-- Jinja2 变量占位符 -->
</body>
</html>
视图函数中渲染模板:使用 函数,传递变量到模板
render_template
from flask import render_template
@app.route('/hello/<username>')
def hello(username):
# 渲染 index.html,将 username 变量传递给模板
return render_template('index.html', username=username)
模板引擎解析:Flask 调用 Jinja2 引擎,替换模板中的变量(如 ),生成最终的 HTML 字符串
{{ username }}
返回 HTML 响应:Flask 将 HTML 字符串封装为响应(),发送给浏览器,浏览器渲染页面。
Content-Type: text/html
2. 静态文件加载流程
静态文件(CSS、JS、图片)放在 文件夹中,加载流程如下:
static
创建静态文件:在 中新建
static/css
style.css
/* static/css/style.css */
h1 {
color: blue;
font-size: 24px;
}
模板中引用静态文件:使用 生成静态文件 URL
url_for('static', filename='路径')
<!-- templates/index.html -->
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
浏览器请求静态文件:页面加载时,浏览器会发送 GET 请求(如 )
http://127.0.0.1:5000/static/css/style.css
Flask 返回静态文件:Flask 自动匹配 文件夹中的文件,返回文件内容作为响应,浏览器加载后应用样式。
static
五、Flask 流程的核心特点与注意事项
1. 核心特点
轻量级:核心流程无冗余,仅保留必要步骤,扩展按需添加,灵活性高。上下文驱动:通过请求上下文()、应用上下文(
request)简化数据传递,避免全局变量污染。路由与视图解耦:通过装饰器注册路由,视图函数专注于业务逻辑,代码结构清晰。
current_app
2. 注意事项
调试模式安全: 会暴露代码详情,生产环境必须关闭。上下文生命周期:请求上下文仅在 “请求处理期间” 有效,不可在异步任务、线程中直接调用
debug=True 对象。生产服务器:内置开发服务器性能差,生产环境需搭配 Gunicorn(WSGI 服务器)+ Nginx(反向代理)使用。
request
六、总结
Flask 的核心流程是 “请求 – 响应循环”,从服务器启动、请求接收,到路由匹配、视图处理,最终生成并返回响应,每个步骤职责明确、耦合度低。其 “微框架” 设计允许开发者根据需求选择扩展,既适合快速开发小型接口(如 API 服务),也能通过扩展构建复杂 Web 应用(如电商平台、管理系统)。
掌握 Flask 流程的关键在于理解 “路由 – 视图 – 上下文” 的关联逻辑,以及扩展如何补充核心流程 —— 这是高效使用 Flask 开发 Web 应用的基础。


