文章目录
在 Flask 中,处理同一个请求路径下的不同参数可以通过多种方式实现,核心是利用 Flask 的路由系统、请求上下文以及参数解析机制。以下是具体的实现方法和代码示例:
一、核心参数类型与处理方式
同一个路径(如 /api/user)可以接收多种参数,常见类型包括:
- URL路径参数(如
/api/user/<user_id>) - 查询参数(如
/api/user?name=张三&age=20) - 表单参数(POST 表单提交的数据)
- JSON参数(请求体中的 JSON 数据)
- 请求头参数(如 Token 等放在 Header 中的数据)
二、具体实现方法
1. URL路径参数(动态路由)
通过在路由中定义 <参数名> 或 <类型:参数名> 捕获路径中的动态部分,适合标识资源(如 ID、名称等)。
from flask import Flask
app = Flask(__name__)
# 基本用法:捕获字符串参数
@app.route('/api/user/<username>')
def get_user_by_name(username): # 函数参数名需与路由参数名一致
return f"查询用户:{username}"
# 带类型约束:仅接受整数(不符合类型会返回404)
@app.route('/api/user/<int:user_id>') # int: 约束参数必须为整数
def get_user_by_id(user_id):
return f"查询用户ID:{user_id}(整数类型)"
# 多个路径参数
@app.route('/api/user/<int:user_id>/posts/<int:post_id>')
def get_user_post(user_id, post_id):
return f"用户ID:{user_id} 的文章ID:{post_id}"
if __name__ == '__main__':
app.run(debug=True)
支持的类型约束:
int:整数float:浮点数path:字符串(包含斜杠,如/a/b/c)uuid:UUID格式字符串
2. 查询参数(Query Parameters)
通过 URL 中 ? 后的键值对传递(如 /api/search?keyword=flask&page=1),适合筛选、分页等场景,用 request.args 解析。
from flask import Flask, request
app = Flask(__name__)
@app.route('/api/search')
def search():
# 获取查询参数(默认返回字符串,可指定默认值)
keyword = request.args.get('keyword', default='', type=str) # 关键字
page = request.args.get('page', default=1, type=int) # 页码(转换为整数)
size = request.args.get('size', default=10, type=int) # 每页条数
return {
"message": "查询成功",
"params": {
"keyword": keyword,
"page": page,
"size": size
}
}
if __name__ == '__main__':
app.run(debug=True)
说明:
request.args是一个类字典对象,支持get()方法(可指定默认值和类型)。- 适合传递非敏感的、可选的参数(如筛选条件、分页信息)。
3. 表单参数(Form Data)
处理 POST 表单提交的数据(如 HTML 表单),用 request.form 解析。
from flask import Flask, request
app = Flask(__name__)
# 允许该路由接收 GET 和 POST 请求
@app.route('/api/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
# 解析表单参数
username = request.form.get('username') # 用户名
password = request.form.get('password') # 密码
return f"登录信息:{username} / {password}"
else:
# GET 请求返回登录表单(示例)
return '''
<form method="post">
用户名: <input type="text" name="username"><br>
密码: <input type="password" name="password"><br>
<button type="submit">登录</button>
</form>
'''
if __name__ == '__main__':
app.run(debug=True)
4. JSON参数(请求体)
处理请求体中的 JSON 数据(常见于 API 接口),用 request.get_json() 解析。
from flask import Flask, request, jsonify
app = Flask(__name__)
# 处理 POST 请求的 JSON 数据
@app.route('/api/user', methods=['POST'])
def create_user():
# 解析 JSON 数据(确保请求头 Content-Type: application/json)
data = request.get_json() # 若解析失败返回 None
if not data:
return jsonify({"error": "请提交 JSON 数据"}), 400
# 提取 JSON 中的参数
username = data.get('username')
age = data.get('age')
email = data.get('email')
return jsonify({
"message": "用户创建成功",
"user": {
"username": username,
"age": age,
"email": email
}
}), 201 # 201 表示资源创建成功
if __name__ == '__main__':
app.run(debug=True)
5. 混合参数(同一路径多种参数组合)
同一个路径可以同时接收多种类型的参数(如路径参数 + 查询参数 + JSON 参数)。
from flask import Flask, request, jsonify
app = Flask(__name__)
# 路径参数 + 查询参数 + JSON参数 混合
@app.route('/api/user/<int:user_id>/update', methods=['POST'])
def update_user(user_id):
# 1. 路径参数:user_id
# 2. 查询参数:是否强制更新
force = request.args.get('force', default=False, type=bool)
# 3. JSON参数:更新的数据
update_data = request.get_json()
if not update_data:
return jsonify({"error": "缺少更新数据"}), 400
return jsonify({
"message": "用户更新成功",
"params": {
"user_id": user_id,
"force_update": force,
"update_data": update_data
}
})
if __name__ == '__main__':
app.run(debug=True)
请求示例:
POST /api/user/123/update?force=true
Content-Type: application/json
{
"username": "新用户名",
"age": 25
}
6. 请求头参数(Header)
从请求头中获取参数(如 Token、API 版本等),用 request.headers 解析。
from flask import Flask, request
app = Flask(__name__)
@app.route('/api/private')
def private_api():
# 从请求头获取 Token
token = request.headers.get('Authorization')
if not token or not token.startswith('Bearer '):
return "未授权:缺少有效 Token", 401
# 从请求头获取 API 版本
api_version = request.headers.get('X-API-Version', '1.0')
return f"授权成功!Token:{token},API版本:{api_version}"
if __name__ == '__main__':
app.run(debug=True)
请求示例:
GET /api/private
Authorization: Bearer abc123456
X-API-Version: 2.0
三、最佳实践
- 参数校验:对接收的参数进行合法性校验(如类型、长度、格式),可使用
pydantic库简化校验逻辑。from pydantic import BaseModel, ValidationError class UserSchema(BaseModel): username: str age: int = None # 可选参数 email: str @app.route('/api/user', methods=['POST']) def create_user(): try: data = UserSchema(**request.get_json()) # 自动校验 except ValidationError as e: return jsonify({"error": e.errors()}), 400 # ...
2.** 区分 HTTP 方法 **:同一路径的不同 HTTP 方法(GET/POST/PUT/DELETE)可对应不同操作(查/增/改/删),符合 RESTful 设计。
@app.route('/api/user/<int:user_id>', methods=['GET', 'PUT', 'DELETE'])
def handle_user(user_id):
if request.method == 'GET':
return f"查询用户 {user_id}"
elif request.method == 'PUT':
return f"更新用户 {user_id}"
elif request.method == 'DELETE':
return f"删除用户 {user_id}"
3.** 避免参数过多 **:若同一路径参数过多(如超过5个),考虑拆分接口或使用 JSON 结构体传递,提高可读性。
4.** 文档化参数 **:使用 flask-restx 等库为参数添加注释,自动生成 API 文档,方便协作。
四、总结
Flask 通过灵活的参数解析机制,支持在同一路径下处理多种参数类型:
- 路径参数适合标识资源(如 ID);
- 查询参数适合筛选、分页;
- 表单/JSON 参数适合传递复杂数据(如创建/更新资源);
- 请求头参数适合传递元数据(如认证信息)。
结合 HTTP 方法区分操作类型,并做好参数校验,可构建清晰、健壮的接口。
1886

被折叠的 条评论
为什么被折叠?



