Хотя, переключаясь на 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?