Вопрос

У меня есть какой-то код запуска сервера, который лежит в «моделях .py» одного из моих приложений Django. Мне нужно запустить этот код в запуске сервера.

Проблема в том, что код выдает запрос SQL, который предотвращает работу меня syncdb с участием psycopg2 (Это разрушает транзакцию, а таблицы не созданы.)

Положить код в промежуточное программное обеспечение и повышение django.core.exceptions.MiddlewareNotUsed Не оптимально, поскольку я хотел бы иметь эффект в оболочке Django тоже (и в любом случае не звучит код инициализации в промежуточное программное обеспечение.) Также мне нужно будет дождаться первого запроса. Я хочу запустить код на запуске сервера, а не когда первый клиент поставляется на моем сайте.

Сигналы запуска сервера все еще не реализованы в Django, так что это не вариант.

Таким образом, я хотел бы как-то:

  • Проверьте, запущена ли Django SyncDB, поэтому я не делаю запросов,
  • Или, альтернативно, проверьте его соответствующие таблицы, а если они не, то тоже не делайте никаких запросов

Не из вышеупомянутых двух вариантов я нашел в любой из документов. Как я могу это сделать? Или есть лучший (то есть здравый) способ делать то, что я хочу сделать?

Это было полезно?

Решение

Django должен также загрузить urls.py на старте; Я не могу сказать вам, что это подходящее место для вашего кода, но попробуйте, если хотите!

Другие советы

Вы считаете подключение к post_syncdb сигнал? Возможно, вы можете запустить пользовательский SQL на получении этого сигнала. Это может решить на части вашей проблемы; Вы все еще должны выяснить, как запустить SQL на запуск сервера.

Вы можете положить проверку в настройках .py:

import sys
...
IN_SYNCDB = ('syncdb' in sys.argv)

потом

if not settings.IN_SYNCDB:
    # run SQL code

Как насчет кусочка обращения с исключением? При выполнении запроса, но таблица базы данных не существует, Django.db.utils.DatabaseError Поднялся. Попробуйте ..Except Код запроса - это способ удовлетворения ваших второго критериев, как я думаю.

Проблема: модели

class Foo(Model):
    #model definition here

def fun():
    obj=Foo.objects.get(pk=1)
    #other logics here...

fun() #This causes a DatabaseError

Решение: Models.py.

class Foo(Model):
    #model definition here

def fun():
    obj=Foo.objects.get(pk=1)
    #other logics here...

try:
    fun() 
except DatabaseError:
    pass
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top