Coursera 笔记

Module 02 · Web App Deployment using Flask

Request and Response Objects – Using GET and POST Modes请求与响应对象

Coursera ↗

本视频将为您讲解 Flask Request 对象 和 Flask Response 对象 的概念及用法。


定制路由与 HTTP 方法

默认情况下,@app.route 装饰器定义的路径仅响应 GET 方法。

显式定义方法

您可以向 @app.route 装饰器传入 methods 参数来控制该路径响应哪些 HTTP 方法。

  • 隐式 GET:
    Python
    @app.route('/')
    def index():
        return "Hello" # 默认响应 GET
    
    
  • 显式 GET(与隐式 GET 等效):
    Python
    @app.route('/', methods=['GET'])
    def index():
        return "Hello"
    
    
  • 多方法支持:可以同时指定多个方法。

Python

@app.route('/health', methods=['GET', 'POST'])
def health_check():
    if request.method == 'GET':
        return {"status": "OK", "method": "GET"}
    elif request.method == 'POST':
        return {"status": "OK", "method": "POST"}


Flask Request 对象

所有对 Flask 的 HTTP 调用都伴随着一个由 Flask.Request 类创建的 请求对象 (Request Object)。当客户端请求资源时,您可以在相应的路由方法内检查和使用这个请求对象。

Request 对象可用信息

请求对象提供了客户端请求的详细信息:

属性/方法 描述
remote_addr 服务器的地址(主机:端口)元组。
headers 随请求发送的 HTTP 头信息。
url 客户端请求的资源 URL。
access_route 转发请求(如经过多个代理)时,列出所有 IP 地址。
full_path 请求的完整路径,包括任何查询字符串。
is_secure 如果请求使用 HTTPS 或 WSS 协议,则为 True。
is_json 如果请求包含 JSON 数据,则为 True。
cookies 字典,包含随请求发送的所有 Cookie。

常用请求头数据

您可以从 request.headers 中访问这些常见数据:

  • Cache-Control: 浏览器如何缓存的信息。
  • Accept: 客户端能够理解的内容类型。
  • Accept-Encoding: 客户端支持的内容编码。
  • User-Agent: 标识客户端应用、操作系统或版本。
  • Accept-Language: 客户端请求的特定语言和区域设置。
  • Host: 请求服务器的主机名和端口号。

自定义 Request 对象:通常可选,因为默认 Flask.Request 类的属性和方法已足够使用。

从 Request 对象获取数据

Flask 提供了多种方法来获取请求中的数据,从而避免您手动解析数据:

方法/属性 描述 返回类型示例
get_data() 获取 POST 请求 的原始数据,返回 字节 (bytes),需要自行解析。 bytes
get_json() 从 POST 请求 中获取数据并解析为 JSON。 dict 或 list
args 获取 URL 中的 查询参数 (Query Parameters)。 ImmutableMultiDict
json 将请求体数据解析为 字典 (JSON)。 dict
files 提供用户上传的 文件。 ImmutableMultiDict
form 包含表单提交中的所有 表单值。 ImmutableMultiDict
values args 数据与 form 数据的组合。 CombinedMultiDict

提取特定值

args、form、files 和 values 的返回类型是 Multidict、ImmutableMultiDict 或 CombinedMultiDict。它们行为类似于 Python 字典,您可以使用 索引 或 .get()** 方法** 提取值。

  • 索引 ([]):如果参数不存在,会引发错误并返回 400 Bad Request 状态,停止服务器。
    Python
    course_value = request.args['course']
    
  • .get()** 方法**:如果参数不存在,返回 None,不会中断服务器。
    Python
    rating_value = request.args.get('rating')
    


Flask Response 对象

Flask 也会提供一个 响应对象 (Response Object),您可以使用它向客户端发送 自定义属性和头信息。

常见 Response 属性

属性 描述
status_code 指示请求的成功或失败状态代码(例如 200, 404)。
headers 包含响应的更多信息。
content_type 响应内容的媒体类型(例如 text/html)。
content_length 响应消息体的大小。
content_encoding 响应内容的编码方式。
mimetype 响应的媒体类型。
expires 响应被视为过期的时间或日期。

响应对象方法

  • set_cookie(): 在客户端设置一个浏览器 Cookie。
  • delete_cookie(): 在客户端删除一个 Cookie。

Response 对象的创建方式

  • 默认创建:当您在 @app.route 方法中 返回数据 时,Flask 会自动创建一个 **状态码为 200、MIME 类型为 **HTML 的响应对象。
  • jsonify():也会自动创建响应对象,状态码为 200,MIME 类型为 application/json。
  • make_response():用于创建 自定义响应 对象。
  • redirect():Flask 提供的特殊方法,用于返回 302** 状态码** 并将客户端重定向到另一个 URL。
  • abort():用于返回带有 错误条件 的响应,例如 abort(404)。

总结回顾

在本视频中,您学到了:

  • Flask 为每个客户端调用提供了 请求对象 (Request) 和 响应对象 (Response)。
  • 您可以从 request** 对象** 中获取额外的请求信息,例如头信息 (headers)。
  • 您可以解析请求对象以获取查询参数 (args)、请求体 (json, form) 和其他参数。
  • 您可以在将响应发送回客户端之前,在 response** 对象** 上设置状态码和自定义头信息。