Django - 只在AppConfig.ready()中创建一次类实例

时间:2016-07-26 15:01:17

标签: python django

我需要在应用启动(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

1 个答案:

答案 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 ...),那么将创建每个应用程序的新实例。