Джанго не может настроить, когда не использует менеджер - PullRequest
0 голосов
/ 04 марта 2019

У меня странная проблема, надеюсь, кто-то сталкивался с ней раньше.

У меня есть собственный сценарий, расположенный по адресу my_project/my_app/scripts/custom_script.py - Мой желательный вариант использования - передать этому сценарию путь к файлу и обработать его.файл и загрузить / изменить некоторые данные в моей базе данных.

Вот фрагмент этого скрипта:

import django

def setup_django(env):
    if env == 'dev':
        settings = "my_project.my_project.dev_settings"
    elif env == 'stg':
        settings = "my_project.my_project.staging_settings"
    elif env == 'prod':
        settings = "my_project.my_project.prod_settings"
    else:
        raise ValueError("Invalid choice for --env argument: {}".format(env))

    os.environ.setdefault('DJANGO_SETTINGS_MODULE', settings)
    django.setup()


def main():

    env = 'dev'
    setup_django(env)

    # Do stuff with my script

Когда я запускаю вышеизложенное из того же virtualenv, что и мой проект, яполучить ошибку ModuleNotFoundError: No module named 'my_app'

Внутри файла настроек:

...
INSTALLED_APPS = [
    'my_app',
    'django.contrib.admin',
    'django.contrib.auth',
    ...
]
...

Кажется, что когда я вызываю django.setup(), он идет и анализирует мой файл dev_settings и находит my_app в списке INSTALLED_APPS, затем пытается импортировать его напрямую (например, import my_app).Это никогда не будет работать, потому что my_app является подмодулем my_project (должно быть import my_project.my_app).Вот пример структуры каталогов:

my_project
├── my_project
│   ├── __init__.py
│   ├── dev_settings.py
│   ├── prod_settings.py
│   ├── staging_settings.py
│   ├── urls.py
│   └── wsgi.py
├── my_app
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── scripts
│   │   ├── __init__.py
│   │   ├── **custom_script.py**
│   │   └── utils.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── __init__.py
└── manage.py

Этот файл настроек работает нормально с manage.py, как в runserver, так и shell (может найти приложение my_app просто отлично),Однако внутри custom_script.py все кажется потерянным.

Есть идеи?

1 Ответ

0 голосов
/ 04 марта 2019

Используйте команды управления для добавления пользовательских скриптов в ваше приложение, чтобы все конфиги django загружались корректно.

В папке my_app создайте структуру папок ниже

management/
   __init__.py
   commands/
      __init__.py
      my_command.py

В my_command.py

from django.core.management import BaseCommand

class Command(BaseCommand):

    def handle(self, *args, **options):
        print('running custom command')

на вашей оболочке

python manage.py my_command
...