1. 构造函数
from flask import Response # 方式一:直接创建Response对象 resp = Response("Hello World", status=200, headers={"X-Custom": "value"}) # 方式二:使用make_response(推荐) from flask import make_response resp = make_response("Hello World") resp.status_code = 201 resp.headers["X-Custom"] = "value"
构造函数参数
| 参数 | 类型 | 默认值 | 说明 |
|---|
response | str/bytes/iterator | 必填 | 响应体内容 |
status | int/str | 200 | HTTP状态码或状态文本 |
headers | dict/list | None | 响应头 |
mimetype | str | None | MIME类型,如"application/json" |
content_type | str | None | Content-Type头,含编码 |
direct_passthrough | bool | False | 为True时直接传递响应体 |
2. 核心属性
| 属性 | 类型 | 说明 |
|---|
status | str | 响应状态(文本形式),如"200 OK" |
status_code | int | HTTP状态码,如200、404 |
headers | Headers | 响应头对象,支持字典式操作 |
data | bytes | 响应体的字节表示 |
mimetype | str | MIME类型(不含编码),如"text/html" |
content_type | str | Content-Type(含编码),如"text/html; charset=utf-8" |
content_length | int | 响应体字节长度 |
3. 响应头操作
from flask import make_response resp = make_response("Hello") # 获取响应头 value = resp.headers.get("Content-Type") # 设置响应头 resp.headers["X-Custom-Header"] = "my-value" # 批量更新 resp.headers.update({ "X-RateLimit-Limit": "100", "X-RateLimit-Remaining": "50" }) # 删除响应头 del resp.headers["X-Custom-Header"]4. Cookie操作
set_cookie() —— 设置Cookie
python
复制
下载
resp = make_response("Cookie已设置") resp.set_cookie( key="theme", value="dark", max_age=86400, # 有效期24小时(秒) path="/", # 作用路径 domain=".example.com", # 域名 secure=True, # 仅HTTPS传输 httponly=True, # 禁止JavaScript访问 samesite="Lax" # SameSite限制 )
set_cookie参数详解
| 参数 | 类型 | 说明 |
|---|
key | str | Cookie名称 |
value | str | Cookie值 |
max_age | int | 有效秒数,如3600表示1小时 |
expires | datetime | 过期时间(与max_age二选一) |
path | str | Cookie适用的路径 |
domain | str | Cookie适用的域名 |
secure | bool | 仅通过HTTPS发送 |
httponly | bool | 禁止JavaScript访问 |
samesite | str | "Strict"、"Lax"或None |
delete_cookie() —— 删除Cookie
resp = make_response("Cookie已删除") resp.delete_cookie("theme") # 默认删除根路径 resp.delete_cookie("theme", path="/admin") # 指定路径
5. 响应的常见构建方式
| 方式 | 代码 | 适用场景 |
|---|
| 直接返回字符串 | return "<h1>Hello</h1>" | 简单HTML |
| 直接返回字典 | return {"status": "ok"} | JSON API(Flask自动序列化) |
| 返回元组 | return "Not Found", 404 | 自定义状态码 |
| 返回元组+头 | return "OK", 200, {"X-Header": "v"} | 自定义状态码+响应头 |
| 使用make_response | resp = make_response("body") | 需要精细控制 |
| 直接创建Response | return Response("body", status=201) | 完全控制 |
6. 完整代码示例
from flask import Flask, make_response, jsonify, request from datetime import datetime, timedelta app = Flask(__name__) # 1. 自定义响应头 + Cookie @app.route("/custom") def custom_response(): resp = make_response("<h1>Hello, RUNOOB!</h1>") # 设置状态码 resp.status_code = 201 # 设置响应头 resp.headers["X-Custom-Header"] = "my-value" # 设置Cookie(24小时有效) resp.set_cookie("theme", "dark", max_age=86400) resp.set_cookie("lang", "zh-CN", samesite="Lax") return resp # 2. 删除Cookie @app.route("/delete-cookie") def delete_cookie(): resp = make_response("Cookie已删除") resp.delete_cookie("theme") return resp # 3. 返回JSON(自动序列化) @app.route("/api/data") def api_data(): return {"status": "ok", "data": [1, 2, 3]} # 4. 流式响应(大文件传输) @app.route("/stream") def stream_response(): def generate(): for i in range(10): yield f"第{i+1}行数据\n" return Response(generate(), mimetype="text/plain") # 5. 文件下载 @app.route("/download") def download_file(): from io import BytesIO data = BytesIO(b"Hello, RUNOOB!") return Response( data.getvalue(), mimetype="text/plain", headers={"Content-Disposition": "attachment; filename=hello.txt"} ) # 6. 条件响应 @app.route("/conditional") def conditional(): # 如果客户端已缓存,返回304 Not Modified if request.headers.get("If-None-Match") == "abc123": return "", 304 resp = make_response("新内容") resp.headers["ETag"] = "abc123" return resp
7. 响应对象API速查表
| 类别 | 方法/属性 | 说明 |
|---|
| 创建 | Response(body, status, headers) | 创建响应对象 |
| 创建 | make_response(body) | 创建响应对象(推荐) |
| 属性 | resp.status_code | 状态码 |
| 属性 | resp.headers | 响应头(字典式操作) |
| 属性 | resp.data | 响应体(字节) |
| 属性 | resp.mimetype | MIME类型 |
| 头操作 | resp.headers["X-Key"] = value | 设置响应头 |
| 头操作 | resp.headers.get("X-Key") | 获取响应头 |
| Cookie | resp.set_cookie(key, value, **options) | 设置Cookie |
| Cookie | resp.delete_cookie(key) | 删除Cookie |
# 常用状态码 STATUS_200 = 200 # OK STATUS_201 = 201 # Created STATUS_204 = 204 # No Content STATUS_301 = 301 # Moved Permanently STATUS_302 = 302 # Found STATUS_400 = 400 # Bad Request STATUS_401 = 401 # Unauthorized STATUS_403 = 403 # Forbidden STATUS_404 = 404 # Not Found STATUS_405 = 405 # Method Not Allowed STATUS_429 = 429 # Too Many Requests STATUS_500 = 500 # Internal Server Error
8. 常见用法总结
| 场景 | 代码 |
|---|
| 返回JSON | return {"status": "ok"} |
| 返回HTML | return render_template("page.html") |
| 返回404 | return "Not Found", 404 |
| 重定向 | return redirect(url_for("index")) |
| 设置Cookie | resp.set_cookie("key", "value", max_age=3600) |
| 设置响应头 | resp.headers["X-Key"] = "value" |
| 文件下载 | Response(data, headers={"Content-Disposition": "attachment; filename=..."}) |
| 流式响应 | Response(generate(), mimetype="text/plain") |
小结
本章全面讲解了Flask响应对象的完整API。Response类通过Response(body, status, headers)创建,更推荐使用make_response(body)函数;核心属性包括status_code、headers、data、mimetype;响应头通过headers["Key"] = value设置;Cookie通过set_cookie(key, value, max_age, secure, httponly, samesite)设置,通过delete_cookie(key)删除;视图函数可返回字符串、字典、元组、Response对象等,Flask会自动转换。熟练掌握响应对象的API,有助于构建符合HTTP规范的完整响应。