Flask 使用 _app_ctx_stack

2021-08-11 21:20 更新

在上面的例子中,在每个请求之前,一个 sqlite3_db 被分配到 _app_ctx_stack.top 。在一个视图函数中,这个变量可以使用 SQLite3 的属性 connection 来访问。在请求销毁时, sqlite3_db 连接被关闭。 通过使用这个模式, 相同 的 sqlite3 数据库连接在请求期间对任何需要它的东 西都是可访问的。

如果 _app_ctx_stack 因为用户使用了老版本的 Flask 不存在, 建议退化到限定在请求中的 _request_ctx_stack

销毁行为

这只在你想要支持 Flask 0.6 和更老版本时有关

由于在 Flask 0.7 中关于在请求的最后运行的函数的变更,你的应用需要在此格外 小心,如果要继续支持 Flask 的更老版本。下面的模式是一个兼顾新旧的好方法:

def close_connection(response):
    ctx = _request_ctx_stack.top
    ctx.sqlite3_db.close()
    return response

if hasattr(app, 'teardown_request'):
    app.teardown_request(close_connection)
else:
    app.after_request(close_connection)

严格地讲,上面的代码是错误的,因为销毁函数接受异常且典型地不返回任何东西。 尽管如此,因为返回值被丢弃,这刚好会工作,假设中间的代码不触碰传递的参数。

他山之石,可以攻玉

本文档只接触了扩展开发中绝对的最小部分,如果你想要了解更多,一个非常好的 主意是查看 Flask Extension Registry 上已有的扩展。如果你感到失落,也有 邮件列表IRC 频道 来获取一些漂亮 API 的想法。特别是当你在做之前 没人做过的东西,这会是一个非常好的主意来获得更多投入。这不仅获得人们会想 从扩展中得到什么的想法,也可避免多个开发者重复发明轮子。

记住:良好的 API 设计是困难的,所以请在邮件列表里介绍你的项目,让 其它开发者在 API 设计上助你一臂之力。

最好的 Flask 扩展是那些为 API 共享通用风格的扩展,并且这只在起初就协作时 奏效。


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号