全书目录

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

第六章:`current_app`、`g`、`session` 分别该放什么

1 分钟 376 字 第 523 / 962 个阅读单元

这三个对象最容易混。

先直接下结论:

对象 应该放什么 不该放什么
current_app 当前 app 的配置和能力入口 业务临时数据
g 当前请求生命周期内的临时对象 跨请求长期状态
session 用户跨请求的小型会话状态 大对象、敏感明文、服务器级状态

最典型的 g 用法,是放当前请求里复用的数据库连接:

py
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()

然后在应用初始化时注册收尾逻辑:

py
def init_app(app):
    app.teardown_appcontext(close_db)

这张图要吃透:

text
一次请求
│
├── g.db 第一次访问时创建
├── 后续代码都复用它
└── 请求结束 teardown 时关闭

session 的一个关键事实也必须知道:

Flask 默认 session 是基于 cookie 的签名会话。 它会把你放进 session 的值序列化到 cookie 中,并做签名保护。

这意味着:

  • 用户通常能看到内容
  • 但不能随便篡改
  • 前提是你的 SECRET_KEY 必须安全
  • 它不适合塞大对象,更不适合塞真正机密

所以 session 更像“通行腰牌”,不是“云端档案库”。