Python 现代开发学习笔记

(二)第一条页面响应与 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 的响应转换规则决定。

收到请求后匹配函数,分别把 HTML 字符串、字典和带状态及头的元组转换为 HTTP 响应,再由测试客户端读取

要在浏览器打开这份独立应用,先进入 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,再回到项目目录。

笔记正文与全部题解 · Ctrl / ⌘ K