Импорт Django настроек из нескольких файлов - PullRequest
0 голосов
/ 11 марта 2020

Есть много советов, почему нельзя легко извлечь настройки из нескольких файлов, например:

import base
import app1
import app2
import local

, ни один из них не видит настройки из файлов ранее и не может их изменить.

Одним из решений является импорт всех файлов в цепочке:

local.py: импорт app2

app2.py: импорт app1

app1.py: база импорта

Это неуклюже.

====

Еще одним решением было объединить все файлы в один.

Мне действительно нравится этот. Я хотел бы найти в нескольких каталогах (хорошо, по крайней мере, в одном) файлы * .py, отсортировать их по имени файла и импортировать / объединить их, чтобы:

base.py -> 000_base.py
local.py -> zzz_local.py

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

Существует ли какой-нибудь Django инструмент / каркас / модель, который реализует это уже или, по крайней мере, помогает?

Спасибо

1 Ответ

0 голосов
/ 11 марта 2020
Импорт

Python не включает C или PHP. import somemodule не внедряет имена, определенные в somemodule в текущей области, он загружает модуль (если он еще не был) и связывает его с именем somemodule - тогда вы можете получить доступ к именам, определенным в модуль с использованием квалифицированного пути ie somemodule.SOME_NAME.

Если вы хотите напрямую связать имена верхнего уровня модуля в импортируемом пространстве имен, вы должны либо сделать это явно (from some_module import SOME_NAME, SOME_OTHER_NAME et c ) или используйте импорт с подстановочными знаками (from some_module import *), но это плохая практика, поскольку это приводит к трудностям в диагностике ошибок и к черту общего обслуживания (подсказка: если два из ваших импортированных модулей определяют одно и то же имя, вы получите только последнее импортированное one).

За прошедшие годы я пробовал довольно много решений, и ни одно из них не было действительно удовлетворительным, поэтому сейчас я просто пишу полный автономный файл настроек для каждой среды (local, preview, preprod, prod) и использую хук моей virtualenv post_activate, чтобы DJANGO_SETTINGS_MODULE envvar указывал на нужный файл настроек.

Для настроек по умолчанию для каждого приложения я использую модуль app/settings, который ch импортирует django.conf.settings и устанавливает значение по умолчанию, если оно еще не определено, затем используйте этот модуль приложения / настроек (вместо django .conf.settings) в приложении, ie:

# myapp/settings.py
from django.conf import settings

SOMETHING = getattr(settings, "MYAPP_SOMETHING", 42)
ANOTHER = getattr(settings, "MYAPP_ANOTHER", False)

then

# myapp/models.py
from . import settings

class Foo(models.Model):
    bar = models.IntegerField(default=settings.SOMETHING)

В случае необходимых настроек приложения, я проверяю их в файле настроек моего приложения:

# myapp/settings.py
from django.exceptions import ImproperlyConfigured
from django.conf import settings

SOMETHING = getattr(settings, "MYAPP_SOMETHING", 42)
ANOTHER = getattr(settings, "MYAPP_ANOTHER", False)

try:
    REQUIRED = getattr(settings, "MYAPP_REQUIRED")
except AttributeError:
    raise ImproperlyConfigured("you must defined settings.MYAPP_REQUIRED")

Эта схема также позволяет проверять пользовательские настройки, ie если вы ожидаете int и пользователь использовал строку:

SOMETHING = getattr(settings, "MYAPP_SOMETHING", 42)
if not isinstance(SOMETHING, int):
    raise ImproperlyConfigured("settings.MYAPP_SOMETHING must be an int")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...