我正在使用Flask构建我的Web应用程序,并且我想注册一个全局资源,该资源表示与远程服务的连接,该服务的持续时间超过请求(在这种情况下,连接是一个可以有效的SOAP连接最多30天).
另一个例子可能是像MongoDB这样的数据库,它处理驱动程序中的连接池,如果你在每个请求上创建了一个新的连接,它将表现不佳.
应用程序上下文和请求上下文似乎都不适合此任务.
问题"将另一个对象传递给主要烧瓶应用程序 "表明我们将这些资源存储在app.config字典中.
如果它必须与您的应用程序的实例化一致,那么您应该继承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对象时启动,并在第一个请求进入时隐式结束"
相反,您希望在模块级别创建资源.然后你可以将它作为扩展名附加到应用程序,或者是,甚至在配置中 - 尽管从它中快速扩展它会更加一致和合乎逻辑.