(二)第一条页面响应与 JSON 响应
先让浏览器访问一句问候,并用测试客户端观察三种响应。
# 项目文件:demos/first_routes.py
from html import escape
from flask import Flask, jsonify, request
app = Flask(__name__)
@app.get("/hello")
def hello():
# 查询参数来自 HTTP 文本,插入 HTML 前执行转义。
name = request.args.get("name", "读者")
return f"<h1>你好,{escape(name)}</h1>"
@app.get("/books/<int:book_id>")
def book(book_id):
# 路径转换器把编号转为 int;返回字典时 Flask 组织 JSON。
return {"id": book_id, "title": "Python 入门"}
@app.post("/inspect")
def inspect():
# get_json 根据 Content-Type 解析;错误 JSON 会产生 400。
data = request.get_json()
return jsonify(received=data), 201, {"X-Example": "flask"}
if __name__ == "__main__":
client = app.test_client()
print(client.get("/hello?name=Python").text)
print(client.get("/books/3").json)
print(client.post("/inspect", json={"title": "Python Web"}).status_code)
print(
client.post("/inspect", data="title=A").status_code
) # Content-Type 不匹配得到 415。# 在 shelf_project 中运行短例,不需要先初始化书架数据库。
uv run python ../demos/first_routes.py
输出包含 <h1>你好,Python</h1>、编号为 3 的书籍字典、新增响应 201,最后一条为 415。app.test_client() 创建本进程内的 WSGI 测试客户端,get、post 把请求交给应用,返回的响应可通过 .text 读文本、.json 读解析后的 JSON、.status_code 读状态。
Flask(__name__) 创建 WSGI 应用,__name__ 帮助它定位模块和资源。@app.get 绑定请求方法、路径和函数;收到请求时才执行函数体。返回字符串时默认按 HTML 发送,返回字典时按 JSON 发送,jsonify 则明确创建 JSON 响应。
return jsonify(...), 201, {...} 使用三项元组,依次提供响应内容、状态和响应头。它表达的结果与上一章设置 status_code 和 Response.headers 相同,写法由 Flask 的响应转换规则决定。
要在浏览器打开这份独立应用,先进入 Flask/demos,再使用项目解释器启动:
# 从 shelf_project 进入相邻 demos;解释器仍来自项目环境。
cd ../demos
../shelf_project/.venv/Scripts/python.exe -m flask --app first_routes run --port 8772打开 问候页面,浏览器会把 <h1> 当作标题。插入到标题中的名字经过 html.escape,所以用户输入的尖括号作为文字显示。结束时按 Ctrl+C,再回到项目目录。