Как вызвать django.setup () в console_script?

Текущие django docs говорят мне следующее:

django.setup () может быть вызван только один раз.

Поэтому избегайте применения многоразовой логики приложения в автономных сценариях, поэтому вам нужно импортировать из сценария в другом месте приложения. Если вы не можете этого избежать, поместите вызов django.setup () внутри блока if:

if __name__ == '__main__': import django django.setup() 

Источник: вызов django.setup () необходим для использования в автономном режиме Django

Я использую точки входа в setup.py. Таким образом, у меня нет __name__ == '__main__' .

Вопрос

Как обеспечить, чтобы django.setup () вызывается только один раз, если вы используете console_scripts ?

Где я должен положить django.setup() ?

Задний план

Фактическая ошибка у меня: Django зависает. Вот почему: https://code.djangoproject.com/ticket/27176

Я хочу перенести приложение на текущую версию django. Переход к команде управления не является опцией, поскольку другие (сторонние приложения) полагаются на наличие моих консольных скриптов.

4 Solutions collect form web for “Как вызвать django.setup () в console_script?”

была та же проблема (или что-то подобное). Я решил это, сделав:

[Предупреждение: грязное решение]

 if not hasattr(django, 'apps'): django.setup() 

таким образом, он будет вызываться только один раз, даже если он импортируется несколько раз

Я работал в двух продуктовых пакетах Python с явным вызовом django.setup() в console_scripts .

Самое главное, что вы должны отметить: DJANGO_SETTINGS_MODULE в env пути.

Вы можете установить это значение в сценарии оболочки или даже загрузить настройки по умолчанию в свой скрипт python.

Вот пример:

 # setup.py entry_points={ 'my-cli = mypackage.cli:main' } 

,

 # cli.py import logging from os import environ as env if not 'DJANGO_SETTINGS_MODULE' in env: from mypackage import settings env.setdefault('DJANGO_SETTINGS_MODULE', settings.__name__) import django django.setup() # this line must be after django.setup() for logging configure logger = logging.getLogger('mypackage') def main(): # to get configured settings from django.conf import settings # do stuffs if __name__ == '__main__': main() 

Здесь https://docs.djangoproject.com/en/1.10/_modules/django/#setup мы видим, что действительно делает django.setup .

Настройте параметры (это происходит как побочный эффект доступа к первой настройке), настройте ведение журнала и запишите реестр приложений. Установите префикс скрипта для локального urlresolvers, если set_prefix равен True.

Таким образом, чтобы убедиться, что установка уже выполнена, мы можем проверить, готовы ли приложения и настроены настройки

 from django.apps import apps from django.conf import settings if not apps.ready and not settings.configured: django.setup() 

Поскольку я обожаю код без условий, я использую это решение. Это похоже на django docs, но ульги, if __name__ == '__pain__' избежать if __name__ == '__pain__' .

Файл с кодом:

 # utils/do_good_stuff.py # This file contains the code # No `django.setup()` needed # This code can be used by web apps and console scripts. from otherlib import othermethod def say_thank_you(): ... 

Файл для основного:

 # do_good_stuff_main.py import django django.setup() def say_thank_you_main(): from myapp import do_good_stuff return do_good_stuff() 

setup.py:

  'console_scripts': [ 'say_thank_you=myapp.do_good_stuff_main:say_thank_you_main', ... 

Это мое текущее решение. Приветствуем Ffeeback. Есть что улучшить?

  • Python: как получить доступ к файлу из другого каталога
  • ImportError: нет модуля с именем ***** в python
  • Как проверить, был ли импортирован модуль python?
  • символ utf-8 в пути пользователя не позволяет импортировать модуль
  • Циркулярная зависимость импорта в Python
  • import matplotlib.pyplot зависает
  • модуль реимпортируется, если импортирован из другого пути
  • Разница между импортом и __import__ в Python
  • Python - лучший язык программирования в мире.