全书目录

第二十九篇:Flask 完全指南 —— 轻骑兵微服务街区宇宙

第五章:上下文系统 —— 为什么 `request` 像全局变量,却又不是全局变量

1 分钟 192 字 第 522 / 962 个阅读单元

Flask 最容易让新手又爱又怕的,是这几个对象:

  • request
  • session
  • current_app
  • g

它们看起来像随处可拿的全局变量,但本质不是普通全局变量。

你可以把它理解成:

text
每个请求都有一位专属信使
│
├── request      = 这位信使带来的资料袋
├── session      = 这个访客的通行腰牌记录
├── current_app  = 当前正在值勤的街区军旗
└── g            = 本次任务的临时鞍袋

请求一来,Flask 会推入两层上下文:

text
Request Context  -> 让 request / session 可用
App Context      -> 让 current_app / g 可用

请求一结束,这两层上下文就会被弹出。

所以你才会看到那个经典错误:

text
RuntimeError: Working outside of request context.
RuntimeError: Working outside of application context.

这句话翻译成人话就是:

你现在不在一次有效巡逻任务里,别乱拿这次任务的信使袋和鞍袋。