(二十四)按请求与状态定位问题
1. 从响应找到第一处差异
表单 422 先看对应字段提示,以及 values 中保留的原输入。400 的表单验证错误先刷新页面,再检查本次隐藏字段和 Cookie 是否来自同一会话;浏览器前后切换账号时,登录前的旧令牌已经被替换。
页面反复跳登录,先核对 Cookie 有没有随请求发送,再查当前实例目录、签名密钥和 logins 记录。重启后突然变成空书架,继续核对是否换了工作目录或 SHELF_INSTANCE,以及是否登录了另一个账号。
Working outside of application context 表示读取 current_app 或 g 时没有当前应用;命令使用 with app.app_context() 或 with_appcontext。只有应用上下文时读取 request 仍然会报请求上下文错误,应该从实际 HTTP 请求或测试请求上下文进入。
2. 对照前两章的职责
| 同一项工作 | 第十二章手动组织 | FastAPI 项目 | Flask 项目 |
|---|---|---|---|
| 路由与参数 | 自己匹配和解析 | 路由声明与参数模型 | 路由转换器与 request 显式读取 |
| 输入检查 | 校验函数 | Pydantic | 表单校验函数与数据类 |
| 数据库工作资源 | 请求内连接 | 请求内 SQLAlchemy Session | g 中的请求内连接 |
| 身份进入请求 | Cookie 会话编号 | 主动发送 Bearer 头 | Flask 签名 Cookie 加服务器登录记录 |
| 输出 | 手动组织 HTML 或 JSON | 公开响应模型 | Jinja 模板或 jsonify |
| 成功写入 | 提交后跳转或返回 | 提交后交回 JSON | 提交后 303 再读取页面 |
Flask 的普通页面视图运行在 WSGI 调用中。这章的同步 SQLite 与模板渲染沿同一次请求完成。把长时间采集或训练直接放入视图,响应就会一直等待;需要异步工作时,再把任务编号、持久状态和独立执行接起来,沿第八章与前一章的任务流程设计。