确保你已经在 Flask 应用中导入了 request:

from flask import Flask, request app = Flask(__name__)
request.args - 查询字符串参数
当 URL 中包含 后面的键值对时,这些参数就是查询字符串参数,在 http://127.0.0.1:5000/search?keyword=flask&page=1 中,keyword 和 page 就是查询参数。
- 获取方式:
request.args是一个ImmutableMultiDict对象,可以像字典一样操作。 - 特点:一个键可以对应多个值(
?key=1&key=2)。
常用方法:
-
get(key, default=None, type=None)(推荐)- 获取指定
key的第一个值。 key不存在,返回default值(默认为None)。type用于指定值的类型,Flask 会尝试转换它(如int,float,str)。
@app.route('/search') def search(): # 获取 keyword 参数,如果不存在则返回空字符串 keyword = request.args.get('keyword', '') # 获取 page 参数,并尝试转换为整数,如果转换失败或不存在则默认为 1 page = request.args.get('page', 1, type=int) return f"Searching for '{keyword}', page {page}" - 获取指定
-
getlist(key)- 获取指定
key的所有值,返回一个列表。 - 当一个参数有多个值时非常有用。
@app.route('/tags') def tags(): # 假设 URL 是 /tags?tech=flask&tech=python&web technologies = request.args.getlist('tech') # technologies 将会是 ['flask', 'python'] # 对于没有值的参数,getlist 会返回空列表 other_tags = request.args.getlist('web') # other_tags 将会是 [] return f"Technologies: {technologies}, Other tags: {other_tags}" - 获取指定
-
to_dict()
(图片来源网络,侵删)- 将所有查询参数转换为普通 Python 字典。
@app.route('/params_dict') def params_dict(): params = request.args.to_dict() # params 将会是 {'keyword': 'flask', 'page': '1'} return str(params)
request.form - 表单数据
当客户端通过 HTML 表单(method="post")提交数据时,数据会存放在 request.form 中。
- 获取方式:同样是
ImmutableMultiDict对象,用法与request.args完全相同。
示例:
HTML (templates/login.html):
<form action="/login" method="post">
<label for="username">Username:</label>
<input type="text" id="username" name="username"><br>
<label for="password">Password:</label>
<input type="password" id="password" name="password"><br>
<input type="submit" value="Login">
</form>
Flask 视图:
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
# 使用 .get() 获取表单数据,防止 KeyError
username = request.form.get('username')
password = request.form.get('password')
if username and password:
return f"Welcome, {username}!"
else:
return "Please fill out both fields."
# GET 请求时显示登录页面
return render_template('login.html')
request.json - JSON 数据
当客户端发送 Content-Type: application/json 的请求体时,Flask 会自动解析它,并将其内容存放在 request.json 中。
- 获取方式:
request.json是一个 Python 字典。 - 重要:如果请求体不是有效的 JSON,或者
Content-Type不正确,访问request.json会返回None并设置 400 错误。
示例:
使用 curl 发送请求:
curl -X POST \
http://127.0.0.1:5000/api/user \
-H "Content-Type: application/json" \
-d '{"name": "Alice", "age": 30}'
Flask 视图:
@app.route('/api/user', methods=['POST'])
def create_user():
# 检查请求是否包含 JSON 数据
if request.is_json:
data = request.json # data 是一个字典: {'name': 'Alice', 'age': 30}
name = data.get('name')
age = data.get('age')
# 在这里处理数据,例如保存到数据库
return f"User {name} (age {age}) created successfully!", 201
else:
return "Request must be JSON.", 400
request.values - 查询字符串和表单的并集
request.values 是 request.args 和 request.form 的并集,它会优先查找 request.form 中的值,然后再查找 request.args 中的值。
- 获取方式:用法与
args和form相同。
# 假设 URL 是 /profile?id=123 (来自 request.args)
# 并且表单中有一个字段 name="John" (来自 request.form)
@app.route('/profile')
def profile():
# form 和 args 中都有 'id',它会获取 form 中的 'id'
# form 中没有 'id',它会获取 args 中的 'id'
user_id = request.values.get('id')
name = request.values.get('name')
return f"Profile ID: {user_id}, Name: {name}"
request.cookies - Cookie 数据
用于获取客户端发送过来的 Cookie。
- 获取方式:
request.cookies是一个字典。
@app.route('/')
def index():
# 获取名为 'username' 的 cookie
username = request.cookies.get('username')
if username:
return f"Hello again, {username}!"
else:
return "Hello, new visitor!"
request.headers - 请求头信息
用于获取 HTTP 请求头。
- 获取方式:
request.headers是一个类似字典的对象,不区分大小写。
@app.route('/headers')
def headers():
# 获取 User-Agent 头
user_agent = request.headers.get('User-Agent')
# 获取 Host 头
host = request.headers.get('Host')
return f"Your browser is: {user_agent}<br>Host: {host}"
其他有用的 request 属性
| 属性 | 描述 |
|---|---|
request.method |
获取 HTTP 请求方法,如 'GET', 'POST'。 |
request.url |
获取完整的请求 URL,包括查询字符串。 |
request.base_url |
获取不带查询字符串的基础 URL。 |
request.endpoint |
获取请求对应的 Flask 端点名称(视图函数名)。 |
request.path |
获取 URL 的路径部分,不包括查询字符串。 |
request.files |
获取上传的文件。request.files['file'] 会返回一个 FileStorage 对象。 |
request.data |
获取原始请求体(字节流),在处理非表单、非 JSON 数据时有用。 |
总结与最佳实践
-
使用
.get()方法:始终使用request.args.get()或request.form.get()而不是直接使用[]访问,这样可以避免当参数不存在时抛出KeyError异常,并能提供默认值,使代码更健壮。 -
指定类型:对于数字、日期等参数,使用
request.args.get('key', type=int),让 Flask 自动帮你转换和验证,避免手动转换出错。 -
区分数据来源:
- URL 中的参数用
request.args。 - HTML 表单用
request.form。 - API 的 JSON 数据用
request.json。
- URL 中的参数用
-
注意
MultiDict:args,form,values,cookies都是MultiDict,这意味着一个键可以有多个值,如果确定只有一个值,用.get();如果可能有多个值,用.getlist()。
掌握了这些,你就可以在 Flask 应用中灵活地处理所有类型的客户端请求了。
