00:00

文章目录

加载目录中...

Flask Request对象介绍

 

什么是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 表单 POSTPUT 请求提交的数据( content-type 通常是 application/x-www-form-urlencodedmultipart/form-data)。
    • 示例:假设表单提交了 usernameemail 字段。
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 或自定义二进制协议。
  • request.jsonrequest.get_json()
    • 说明:这是非常常用的属性/方法。如果请求的 Content-Typeapplication/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 对象,你可以像操作 Python file 对象一样操作它,也有 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 到客户端需要使用响应对象 responseset_cookie 方法。
    • 示例
username = request.cookies.get('username')
返回文章列表

评论区 0