Где разместить код запуска Django? - PullRequest
50 голосов
/ 06 мая 2010

Мне бы хотелось, чтобы эти строки кода выполнялись при запуске сервера (как при разработке, так и при производстве):

from django.core import management
management.call_command('syncdb', interactive=False)

Помещение в settings.py не работает, так как требует загрузки настроек уже.

Помещение их в представление и внешний доступ к этому представлению также не работает, так как есть некоторые промежуточные программы, которые используют базу данных, и они не работают и не дают мне доступ к представлению.

Поместить их в промежуточное ПО будет работать, но это будет вызываться каждый раз, когда к моему приложению обращаются. Возможным решением может быть создание промежуточного программного обеспечения, которое выполняет всю работу, а затем удаляет себя из MIDDLEWARE_CLASSES, чтобы оно больше не вызывалось. Могу ли я сделать это без слишком большого количества исправлений обезьян?

Ответы [ 6 ]

55 голосов
/ 06 мая 2010

Напишите промежуточное программное обеспечение, которое делает это в __init__, а затем поднимите django.core.exceptions.MiddlewareNotUsed из __init__, django удалит его для всех запросов :). Кстати, __init__ вызывается при запуске, а не по первому запросу, поэтому он не заблокирует вашего первого пользователя.

Говорят о добавлении сигнала запуска, но он скоро будет недоступен (например, основная проблема - когда этот сигнал должен быть отправлен)

Билет по теме: https://code.djangoproject.com/ticket/13024

Обновление: Django 1.7 включает поддержку для этого. ( Документация , связанная с билетом)

4 голосов
/ 08 мая 2010

Если вы использовали Apache / mod_wsgi для обоих, используйте файл сценария WSGI, описанный в:

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 голосов
/ 28 августа 2011

Вы можете создать собственную команду и написать свой код в функции handle. подробности здесь https://docs.djangoproject.com/en/dev/howto/custom-management-commands/

Затем вы можете создать сценарий запуска, который запускает сервер django, затем выполняет вашу новую пользовательскую команду.

1 голос
/ 07 мая 2010

Если вы используете mod_wsgi, вы можете поместить его в приложение wsgi start

0 голосов
/ 21 ноября 2018

В Django 1.7+, если вы хотите запустить код запуска, и,

1. Избегайте запуска его в миграциях, make-миграциях, сеансах оболочки, ...

2. Старайтесь не запускать его дважды или более

Решение будет:

файл: myapp/apps.py

from django.apps import AppConfig

def startup():
    # startup code goes here

class MyAppConfig(AppConfig):
    name = 'myapp'
    verbose_name = "My Application"
    def ready(self):
        import os
        if os.environ.get('RUN_MAIN'):
            startup()

файл: myapp/__init__.py

default_app_config = 'myapp.apps.MyAppConfig'

В этом сообщении используются предложения @Pykler и @ bdoering

0 голосов
/ 26 декабря 2013

Вот как я работаю с отсутствующим сигналом запуска для Django: https://github.com/lsaffre/djangosite/blob/master/djangosite/models.py Код, который вызывается там, специфичен для моего проекта djangosite, но хитрость, чтобы вызвать его, написав специальное приложение (основанное на идее Росса Макфарланда), должна работать для других сред. Люк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...