什么是request对象
request 是 Flask 框架的一个全局代理对象,它封装了客户端(如浏览器)发送给服务器的当前请求的所有信息。你不需要手动创建它,Flask 会自动在每个请求上下文中为你创建好。你只需要从 flask 模块导入即可使用:
from flask import request
重要提示:因为 request 是线程局部的(thread-local),所以在同一个请求的上下文中,在任何地方(视图函数、模板、甚至其他模块的函数中)导入并使用的 request 对象都是指向当前正在处理的这个请求,不会发生混淆。这是 Flask 上下文机制的功劳。
request对象的重要属性和方法
1. 请求元数据 (Request Metadata)
request.method
- 说明:获取当前请求的 HTTP 方法,是一个字符串。
- 值:如
'GET','POST','PUT','DELETE','PATCH'等。 - 示例:常用于根据请求方法执行不同逻辑。
if request.method == 'POST':
# 处理提交逻辑
do_something()
elif request.method == 'GET':
# 处理获取逻辑
show_something()
request.url, request.base_url, request.host_url
- 说明:获取请求的完整 URL 或其一部分。
- 示例
print(request.url) # https://example.com/user?page=1
print(request.base_url) # https://example.com/user (不含查询参数)
print(request.host_url) # https://example.com/ (只有协议和主机)
request.headers
- 说明:一个类似字典的对象,包含了客户端发送的所有 HTTP 请求头信息。键不区分大小写。
- 示例:
user_agent = request.headers.get('User-Agent')
content_type = request.headers.get('Content-Type')
2. URL 查询参数 (URL Arguments - GET Parameters)
request.args- 说明:一个不可变的多值字典(
ImmutableMultiDict),用于获取 URL 问号?后面的查询字符串参数。它只对GET请求有效,但其他方法的请求也可以带查询参数。 - 示例:对于URL
/search?q=flask&page=2&sort=popular
- 说明:一个不可变的多值字典(
search_term = request.args.get('q') # 获取 'flask'
page = request.args.get('page', 1, type=int) # 获取 '2' 并转为整数,默认为1
# 获取所有 'sort' 的值(如果有多选)
sort_list = request.args.getlist('sort')
3. 表单数据 (Form Data - POST Data)
request.form- 说明:一个不可变的多值字典,用于获取通过 HTML 表单
POST或PUT请求提交的数据( content-type 通常是application/x-www-form-urlencoded或multipart/form-data)。 - 示例:假设表单提交了
username和email字段。
- 说明:一个不可变的多值字典,用于获取通过 HTML 表单
username = request.form['username'] # 直接访问,如果不存在会抛 KeyError
email = request.form.get('email') # 安全访问,不存在则返回 None
# 对于多选(如复选框),使用 getlist
selected_items = request.form.getlist('interests')
4. 原始数据与 JSON (Raw Data and JSON)
request.data- 说明:以字节字符串(bytes)形式获取请求的原始体数据。如果请求的
Content-Type不被 Flask 识别(比如不是表单),数据就会被放到这里。 - 用途:常用于接收非表单格式的原始数据,如 XML 或自定义二进制协议。
- 说明:以字节字符串(bytes)形式获取请求的原始体数据。如果请求的
request.json或request.get_json()- 说明:这是非常常用的属性/方法。如果请求的
Content-Type是application/json,它会自动将 JSON 数据解析成一个 Python 字典或列表。get_json()方法更灵活,可以强制解析或设置默认为不解析。 - 示例:接收前端 Ajax 发送的 JSON 数据。
- 说明:这是非常常用的属性/方法。如果请求的
# 方式一:使用属性(如果不是JSON会返回None)
json_data = request.json
# 方式二:使用方法(更推荐)
json_data = request.get_json(force=True) # force=True 即使Content-Type不是JSON也尝试解析
if json_data:
name = json_data.get('name')
age = json_data.get('age')
5. 上传文件 (Uploaded Files)
request.files- 说明:一个不可变的字典,包含了所有上传的文件。每个文件都是一个
FileStorage对象,你可以像操作 Pythonfile对象一样操作它,也有save()方法可以轻松保存。 - 示例:HTML 表单中要有
<input type="file" name="file_upload">。
- 说明:一个不可变的字典,包含了所有上传的文件。每个文件都是一个
uploaded_file = request.files['file_upload']
if uploaded_file.filename != '':
# 保存文件到服务器
uploaded_file.save(f'/path/to/save/{uploaded_file.filename}')
# 或者读取文件内容
file_content = uploaded_file.read()
6. Cookies
request.cookies- 说明:一个标准的 Python 字典,包含了客户端随请求发送的所有 cookies。注意,这是读取客户端发来的 cookie。设置 cookie 到客户端需要使用响应对象
response的set_cookie方法。 - 示例:
- 说明:一个标准的 Python 字典,包含了客户端随请求发送的所有 cookies。注意,这是读取客户端发来的 cookie。设置 cookie 到客户端需要使用响应对象
username = request.cookies.get('username')
评论区 0