Flask长期存在全球资源

idb*_*ley 12 python flask

我正在使用Flask构建我的Web应用程序,并且我想注册一个全局资源,该资源表示与远程服务的连接,该服务的持续时间超过请求(在这种情况下,连接是一个可以有效的SOAP连接最多30天).

另一个例子可能是像MongoDB这样的数据库,它处理驱动程序中的连接池,如果你在每个请求上创建了一个新的连接,它将表现不佳.

应用程序上下文和请求上下文似乎都不适合此任务.

问题"将另一个对象传递给主要烧瓶应用程序 "表明我们将这些资源存储在app.config字典中.

Try*_*ass 5

如果它必须与您的应用程序的实例化一致,那么您应该继承Flask.如果所有操作都将资源附加到对象上,考虑到创建应用程序是一个过程,这实际上并没有做很多事情.事实是,如果应用程序在实例化期间不需要使用您的资源,则可能不需要这样做.

class MyApp(Flask):
    def __init__(self, *args, **kwargs):
        setattr(self, 'some_resource', SomeResource())
        super(Flask, self).__init__(*args, **kwargs)

app = MyApp(__name__)
app.some_resource.do_something()
Run Code Online (Sandbox Code Playgroud)

除非你有一些特定的用例,否则最好不要编写一个包装器类,将其转换为flask-extension,在模块级创建它并将其存储在app.extensions上.

class MyExtensions(object):
    def __init__(self, app=None):
        self.app = app
        if app is not None:
            self.init_app(app)

    def init_app(self, app):
        app.extensions['my_extension'] = SomeResource()

app = Flask(__name__)
my_extension = MyExtension(app)
Run Code Online (Sandbox Code Playgroud)

然后,您可以选择是否要为每个应用程序提供自己的资源(如上所述),或者您是否更愿意使用始终指向当前应用程序的共享资源

from flask import _request_ctx_stack
try:
    from flask import _app_ctx_stack
except ImportError:
    _app_ctx_stack = None

stack = _app_ctx_stack or _request_ctx_stack

class SomeResource(object):
    def do_something(self):
        ctx = stack.top
        app = ctx.app
my_resource = SomeResource()
my_resource.do_something()
Run Code Online (Sandbox Code Playgroud)

我不认为你想将它存储在应用程序上下文中,因为"它在实例化Flask对象时启动,并在第一个请求进入时隐式结束"

相反,您希望在模块级别创建资源.然后你可以将它作为扩展名附加到应用程序,或者是,甚至在配置中 - 尽管从它中快速扩展它会更加一致和合乎逻辑.