我需要在应用启动(runserver)上创建一个类实例(假设后端请求会话),并且我不想在运行其他管理命令后重写此会话。我怎样才能做到这一点?我尝试了几种方法,我不确定为什么这样的东西不起作用。
# app/apps.py
class MyConfig(AppConfig):
....
requests_session = None
....
def ready(self):
if MyConfig.requests_session is None:
MyConfig.requests_session = requests.Session()
不幸的是,始终满足条件并重新创建会话。不过,documentation建议采用这种方法。
对我来说,其他解决方案是仅在使用选定的管理命令子集后运行MyConfig.ready(),这可能吗?
我存储请求会话有更好的方式吗?
TIA
答案 0 :(得分:1)
我认为如果您使用实例变量而不是类变量,它应该可以工作:
# app/apps.py
class MyConfig(AppConfig):
def __init__(self, app_name, app_module):
super(MyConfig, self).__init__(app_name, app_module)
self.requests_session = None
def ready(self):
if self.requests_session is None:
self.requests_session = requests.Session()
现在的问题是如何在其他地方访问此实例变量。你可以这样做:
from django.apps import apps
# Here myapp is the label of your app - change it as required
# This returns the instance of your app config that was initialised
# at startup.
my_app_config = apps.get_app_config('myapp')
# Use the stored request session
req = my_app_config.requests_session
请注意,此实例变量仅存在于当前进程的上下文中。如果您在单独的进程中运行管理命令(例如manage.py ...
),那么将创建每个应用程序的新实例。