Как выполнить произвольный script в контексте моего проекта Django?

Иногда я хочу выполнить файл в контексте моего проекта Django, как если бы я использовал оболочку, но с удобством использования текстового редактора. Это в основном для того, чтобы попробовать что-то или быстро прототипировать некоторые функции, прежде чем вводить их в представление, проверку, повторяющуюся задачу или команду управления.

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

import sys
sys.path.append('/location/of/projet')
from django.core.management import setup_environ
import settings
setup_environ(settings)

Я подумал, что было бы проще сделать команду управления, которая принимает аргумент, модуль python для запуска и выполняет его в среде Django. Здесь команда "runmodule" я написал:

from django.core.management.base import BaseCommand, CommandError

class Command(BaseCommand):
    help = "Runs an arbitrary module, in the Django environment, for quick prototyping of code that too big for the shell."

    def handle(self, *args, **options):
        if not args:
            return
        module_name = args[0]

        try:
            __import__(module_name)
        except ImportError:
            print("Unable to import module %s.  Check that is within Django PYTHONPATH" % (module_name))

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

python manage.py runmodule myapp.trysomethingout

который выполнит myapp/trysomethingout.py. Это лучший способ сделать это?

Ответ 1

Лучший способ выполнить script с правильным контекстом django - установить переменную среды DJANGO_SETTINGS_MODULE в ваш модуль настроек (и при необходимости PYTHONPATH). В окнах это обычно означает выполнение:

set DJANGO_SETTINGS_MODULE=setting 

и bash:

export DJANGO_SETTINGS_MODULE=setting 

Теперь вы можете импортировать свои модели и т.д.

см. https://docs.djangoproject.com/en/dev/topics/settings/#designating-the-settings.

Обратите внимание, что для импорта модуля settings следует использовать from django.conf import settings. Это учитывает DJANGO_SETTINGS_MODULE вместо автоматического использования settings.py.

Ответ 2

Лучшее решение предоставлено в этой статье.

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