Как вызвать 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. Переход к команде управления не является опцией, поскольку другие (сторонние приложения) полагаются на наличие моих консольных скриптов.

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

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

     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. Есть что улучшить?