然而,在我当前的项目中切换到gunicorn时,我明白我在启动时处理模型缓存的方式不是很好。
设置
有几个模型我配备了一个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时附带了特定的上下文。如果没有它,当gunicorn攻击wsgi.py时,应用程序就不会加载
django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.现在我已经考虑过了,从项目的wsgi.py加载应用程序的模型似乎是错误的。那么,我应该在哪里调用load方法,以便在启动时缓存模型--而不是选择wsgi服务器?
发布于 2019-07-01 10:40:38
所有启动代码都应该放在ready方法的AppConfig中。然后在IBSTALLED_APPS上引用config类,而不是应用程序名。这是保证在启动时调用。
https://stackoverflow.com/questions/56832618
复制相似问题