Где должен находиться пользовательский код статута в проектах django? - PullRequest
0 голосов
/ 01 июля 2019

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

1 голос
/ 01 июля 2019

Весь код запуска должен идти в методе ready объекта AppConfig. Затем обратитесь к классу config, а не к имени приложения, в IBSTALLED_APPS. Это гарантированно вызывается при запуске.

См. Документы AppConfig

...