自定义状态代码应该放在 django 项目中的什么地方?
Where should custom statup code live in django projects?
同时,在我当前的项目中切换到 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)
通常,signals 每次模型发生变化时都会调用这些方法。要在启动服务器 时加载这些 ,我只是在 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
带有特定的上下文。没有它,当 gunicorn 命中 wsgi.py
:
时,应用程序不会加载
django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
现在想想,从项目的 wsgi.py
加载应用程序的模型似乎是错误的。那么,我应该在哪里调用 load
方法,以便在启动时缓存模型而不考虑选择的 wsgi 服务器?
所有启动代码都应该放在 AppConfig 的 ready
方法中。然后在 IBSTALLED_APPS 上引用配置 class,而不是应用名称。这保证在启动时被调用。
同时,在我当前的项目中切换到 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)
通常,signals 每次模型发生变化时都会调用这些方法。要在启动服务器 时加载这些 ,我只是在 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
带有特定的上下文。没有它,当 gunicorn 命中 wsgi.py
:
django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
现在想想,从项目的 wsgi.py
加载应用程序的模型似乎是错误的。那么,我应该在哪里调用 load
方法,以便在启动时缓存模型而不考虑选择的 wsgi 服务器?
所有启动代码都应该放在 AppConfig 的 ready
方法中。然后在 IBSTALLED_APPS 上引用配置 class,而不是应用名称。这保证在启动时被调用。