这三个对象最容易混。
先直接下结论:
| 对象 | 应该放什么 | 不该放什么 |
|---|---|---|
current_app |
当前 app 的配置和能力入口 | 业务临时数据 |
g |
当前请求生命周期内的临时对象 | 跨请求长期状态 |
session |
用户跨请求的小型会话状态 | 大对象、敏感明文、服务器级状态 |
最典型的 g 用法,是放当前请求里复用的数据库连接:
import sqlite3
from flask import current_app, g
def get_db():
if "db" not in g:
g.db = sqlite3.connect(current_app.config["DATABASE"])
g.db.row_factory = sqlite3.Row
return g.db
def close_db(e=None):
db = g.pop("db", None)
if db is not None:
db.close()然后在应用初始化时注册收尾逻辑:
def init_app(app):
app.teardown_appcontext(close_db)这张图要吃透:
一次请求
│
├── g.db 第一次访问时创建
├── 后续代码都复用它
└── 请求结束 teardown 时关闭而 session 的一个关键事实也必须知道:
Flask 默认 session 是基于 cookie 的签名会话。
它会把你放进 session 的值序列化到 cookie 中,并做签名保护。
这意味着:
- 用户通常能看到内容
- 但不能随便篡改
- 前提是你的
SECRET_KEY必须安全 - 它不适合塞大对象,更不适合塞真正机密
所以 session 更像“通行腰牌”,不是“云端档案库”。