アプリのインスタンス化と一致する必要がある場合は、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()
特定のユース ケースがない限り、ラッパー クラスを記述し、それをフラスコ拡張に変換し、モジュール レベルで作成して 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)
次に、各アプリに独自のリソースを提供するか (上記のように)、現在のアプリを常に指している共有リソースを使用するかを選択できます。
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()
「Flaskオブジェクトがインスタンス化されると開始し、最初のリクエストが来ると暗黙的に終了する」ため、これをアプリケーションコンテキストに保存したくないと思います
代わりに、リソースをモジュール レベルで作成する必要があります。次に、それを拡張機能としてアプリケーションに添付するか、構成内であっても、それを簡単に拡張する方が一貫性があり論理的ですが、それをアプリケーションに添付できます。