Создание пакета Django и проверка подлинности представления

#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 , но это кажется такой распространенной проблемой, что я был уверен, что должен быть лучший способ 🙂 Спасибо за ваш ответ!