Flask 使用 _app_ctx_stack

在上面的例子中,在每个请求之前,一个 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 共享通用风格的扩展,并且这只在起初就协作时
奏效。

作者:andy,如若转载,请注明出处:https://www.web176.com/flask2/21603.html

(0)
打赏 支付宝 支付宝 微信 微信
andy的头像andy
上一篇 2023年5月18日
下一篇 2023年5月18日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注