Где поставить код запуска Django?
Я бы хотел, чтобы эти строки кода выполнялись при запуске сервера (как для разработки, так и для создания):
from django.core import management
management.call_command('syncdb', interactive=False)
Ввод его в settings.py
не работает, так как он требует, чтобы настройки уже были загружены.
Помещение их в представление и доступ к этому виду извне тоже не работает, так как есть некоторые посредники, которые используют базу данных, и те не будут работать и не позволят мне получить доступ к представлению.
Помещение их в промежуточное ПО будет работать, но это будет вызвано каждый раз, когда будет доступно мое приложение. Возможным решением может быть создание промежуточного программного обеспечения, которое выполняет всю работу, а затем удаляет себя из MIDDLEWARE_CLASSES
, чтобы оно больше не вызывалось. Могу ли я сделать это без слишком много исправления обезьян?
Ответы
Ответ 1
Напишите промежуточное программное обеспечение, которое делает это в __init__
, а затем повысит django.core.exceptions.MiddlewareNotUsed
от __init__
, django удалит его для всех запросов:). __init__
вызывается при запуске, а не при первом запросе, поэтому он не блокирует вашего первого пользователя.
Говорят о добавлении сигнала запуска, но это скоро не будет доступно (основная проблема, например, когда этот сигнал должен быть отправлен)
Связанный билет: https://code.djangoproject.com/ticket/13024
Обновление: Django 1.7 включает поддержку этого. (Документация, связанная с билетом)
Ответ 2
Если вы использовали Apache/mod_wsgi для обоих, используйте файл WSGI script, описанный в:
http://blog.dscpl.com.au/2010/03/improved-wsgi-script-for-use-with.html
Добавьте, что вам нужно, после того как языковые переводы активированы.
Таким образом:
import sys
sys.path.insert(0, '/usr/local/django/mysite')
import settings
import django.core.management
django.core.management.setup_environ(settings)
utility = django.core.management.ManagementUtility()
command = utility.fetch_command('runserver')
command.validate()
import django.conf
import django.utils
django.utils.translation.activate(django.conf.settings.LANGUAGE_CODE)
# Your line here.
django.core.management.call_command('syncdb', interactive=False)
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
Ответ 3
Вы можете создать пользовательскую команду и написать свой код в функции дескриптора. подробнее здесь https://docs.djangoproject.com/en/dev/howto/custom-management-commands/
Затем вы можете создать запуск script, который запускает сервер django, а затем выполняет вашу новую пользовательскую команду.
Ответ 4
Если вы используете mod_wsgi, вы можете поместить его в приложение запуска wsgi
Ответ 5
Вот как я работаю над отсутствующим сигналом запуска для Django:
https://github.com/lsaffre/djangosite/blob/master/djangosite/models.py
Код, который называется там, специфичен для моего проекта djangosite, но трюк, который он вызвал, написав специальное приложение (основанное на идее Росса Макфарланда), должен работать в других средах.
Люк