Где поставить код запуска 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, но трюк, который он вызвал, написав специальное приложение (основанное на идее Росса Макфарланда), должен работать в других средах. Люк