Есть ли какой-нибудь питонный способ загрузки приложения django через псевдоним? Я думаю, это было бы одним из способов сделать приложение более «дружественным к подключаемым устройствам».
есть шаблон, используемый в settings.py:
INSTALLED_APPS = ('... ','...', )
где INSTALLED_APPS
- это кортеж, содержащий названия приложений.
Это хорошо, но я не хочу вставлять некоторые приложения явно таким образом.
Я хотел бы иметь дескриптор приложения с именем скажем external_login_app
, отображающий на drupal_login
или mediawiki_login
(должен быть предоставлен конечным пользователем или третьей стороной), где имя фактического Пользовательский модуль / приложение предоставляется строковой переменной в settings.py
Подключаемая часть (например, mediawiki_login
) должна быть полноценным приложением с собственными представлениями, моделями, формами и т. Д., В то время как external_login_app
должен быть доступен в любом месте остального кода.
Цель здесь - отделить распределенный код от плагинов, подобных этому.
изменить 1: вот что я пытаюсь:
в settings.py
EXTERNAL_LOGIN = __import__(EXTERNAL_LOGIN_APP)
#setting name must be upper case according to
#django docs
но мое пользовательское приложение входа в систему также зависит от файла настроек, поэтому похоже, что у меня круговая проблема импорта с ошибками типа module external_login does not have attribute views
.
Эта проблема кажется очень коварной, поскольку я не могу использовать даже простые вещи, такие как render_to_response
ярлык в представлениях, импортированных с помощью оператора __import__
в settings.py.
edit 2: через некоторое время я обнаружил, что использование __import__()
в файле settings.py не будет работать из-за почти неизбежных циклических зависимостей
Лучший рабочий метод, который я нашел на данный момент, - это помещать __import__()
вызовы в другие .py файлы приложения, обеспечивающие универсальный «потребительский» интерфейс - тот, который вызывает функции плагина:
в settings.py
: как Михал предлагает в своем ответе
EXTERNAL_LOGIN_APP = 'drupal_login'
INSTALLED_APPS = (
'...',
EXTERNAL_LOGIN_APP,
)
например. в app/views.py
:
from django.conf import settings
EXTERNAL_LOGIN = __import__(settings.EXTERNAL_LOGIN_APP, \
[], [], ['api','forms'])
def login_view(request, external=False):
if external:
form = EXTERNAL_LOGIN.forms.LoginForm(request.POST)
if form.is_valid():
login = form.cleaned_data['login']
password = form.cleand_data['password']
if EXTERNAL_LOGIN.api.check_password(login, password):
#maybe create local account,
#do local authentication
#set session cookies for the
#external site to synchronize logins, etc.