#python #django #module
#python #django #модуль
Вопрос:
В проекте Django я создал приложение (через python manage.py startapp), который я хотел бы превратить в импортируемый пакет python теперь, когда проект завершен. Идея состоит в том, чтобы повторно использовать его функциональность в моем новом проекте.
Структура проекта, например, выглядит следующим образом:
myproject/ # the project/site root
manage.py
myproject/... # the core app of a project
templates/... # project template folder
static/... # project static folder
myapp/ # <----------- App in question
__init__.py
admin.py
apps.py
models.py
views.py # <----------- LoginRequiredMixin and @login_required
urls.py
tests/...
migrations/...
templates/...
static/...
myapp2/
myapp3/
myapp4/
...
# In views.py I have several Classes/Functions
# with the authentification mixin/decorators
from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import LoginRequiredMixin
...
class SomeView(LoginRequiredMixin,...):
pass # for views
@login_required
def someFunction(request):
pass # for functions
Разложить приложение по пакетам не составило труда, поскольку оно прекрасно содержится в папке myapp / . Я переместил его в отдельную папку, добавил setup.cfg и setup.py и успешно создал пакет:
pyapp-package/
setup.cfg # <-- setuptools configuration
setup.py # <-- setup()
admin.py # the rest of the app
apps.py
...
Моя проблема (и, следовательно, вопрос) заключается в том, как сделать аутентификацию этого приложения необязательной, когда я устанавливаю его в новый проект через settings.py ?
...
INSTALLED_APPS = [
'myapp-package', # <-- including my app in the new project
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
Я рассматривал возможность удаления LoginRequiredMixin и @login_required из views.py а затем обработайте эту функциональность в urls.py о новом проекте, но я не вижу стандартного решения этой проблемы, задокументированного в документах. Является ли это жизнеспособным вариантом или нужно решить это по-другому.
Спасибо за ваше время!
Ответ №1:
Я предлагаю вам следующий путь. Вы должны создать переменную в settings.py файл, а затем в соответствии с этим значением вы определяете, нужна вам аутентификация или нет.
settings.py
...
LOGIN_REQUIRED = True
...
views.py
from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import LoginRequiredMixin
from <project_name>.settings import LOGIN_REQUIRED
# Determine whether we need or not authentication.
if LOGIN_REQUIRED:
class SomeView(LoginRequiredMixin, ...):
pass
@login required
def some_function(request):
pass
else:
class SomeView(...):
pass
def some_function(request):
pass
Я пока не знаю, как создавать прототипы функций и классов, чтобы следовать принципу DRY. Может быть, кто-то еще может помочь.
Комментарии:
1. Привет! Спасибо! Часть с settings.py вот как бы я тоже решил эту проблему. Единственной проблемой является принцип DRY, который будет нарушен в views.py модуль. Я знаю, что есть возможность немного «взломать» с помощью вызовов функций в urls.py , но это кажется такой распространенной проблемой, что я был уверен, что должен быть лучший способ 🙂 Спасибо за ваш ответ!