自定义状态代码应存放在Django项目的哪里?

时间:2019-07-01 08:48:59

标签: python django gunicorn startup wsgi

在我当前的项目中切换到 gunicorn 时,我了解到我在启动时处理模型缓存的方式不是很好。

设置

  • 应用名称:网站
  • 项目名称:personal_cms

我有几种配备load方法的模型。

class SomeModel(models.Model):
    something      = models.CharField(max_length=60)
    something_else = models.URLField()

    @classmethod
    def load(cls):
        cache.set('{}'.format(cls.__name__), cls.objects.all(), None)

通常,每次模型中发生更改时,信号都会调用这些方法。要在启动服务器时加载 ,我刚刚在wsgi.py中添加了以下内容:

import os

from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'personal_cms.settings')

from website.models import SomeModel, SomeOtherModel
SomeModel.load()
SomeOtherModel.load()

application = get_wsgi_application()

问题

以上代码有效,但仅在使用python manage.py runserver时使用,而不在gunicorn personal_cms.wsgi:application时使用。据我了解,原因是运行manage.py带有特定的上下文。如果没有它,当金枪鱼命中wsgi.py时,将不会加载应用程序:

django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

现在我考虑一下,从项目的wsgi.py加载应用程序的模型似乎是错误的。因此,我应该在哪里调用load方法,以便在启动时缓存模型,而不会选择wsgi服务器?

1 个答案:

答案 0 :(得分:1)

所有启动代码应放入AppConfig的ready方法中。然后在IBSTALLED_APPS上引用配置类,而不是应用程序名称。保证在启动时会调用它。

请参见AppConfig docs