Как требовать входа в Django Generic Views?
Я хочу ограничить доступ к URL-адресам, обрабатываемым Django Generic Views.
Для моих просмотров Я знаю, что login_required
decorator выполняет эту работу.
Также Create/Delete/Update Generic Views принимают аргумент login_required
, но я не мог найти способ сделать это для других общих представлений.
Ответы
Ответ 1
Для Django < 1.5, вы можете добавить декоратор, обернув функцию в свои URL-адреса, что позволяет обернуть общие представления:
from django.contrib.auth.decorators import login_required
from django.views.generic.simple import direct_to_template
urlpatterns = patterns('',
(r'^foo/$', login_required(direct_to_template), {'template': 'foo_index.html'}),
)
Общие представления на основе функций устаревают в Django 1.4 и удаляются в Django 1.5. Но тот же принцип применяется, просто оберните функцию представления класса на основе представления с помощью декоратора login_required
:
login_required(TemplateView.as_view(template_name='foo_index.html'))
Ответ 2
Django 1.9 или используя django-braces
Django 1.9 ввел LoginRequiredMixin, который используется таким образом:
from django.contrib.auth.mixins import LoginRequiredMixin
class MyView(LoginRequiredMixin, View):
login_url = '/login/'
redirect_field_name = 'redirect_to'
Если вы используете более старую версию django, вы можете использовать практически тот же mixin из django-braces - версия Django была основана на версия django-braces. django-braces 1.4.x по-прежнему поддерживает Django 1.4, поэтому вы можете использовать его с довольно старыми версиями.
Старые методы
Я нашел этот вопрос во время поиска для того, чтобы украсить представления, основанные на классе, поэтому добавьте ответ для этого:
Это описано в разделе документации украшение представлений на основе классов. Существует оболочка urls.py
, или вы можете применить декоратор к методу dispatch()
. Примеры из документации:
Украшение в URL conf
from django.contrib.auth.decorators import login_required, permission_required
from django.views.generic import TemplateView
from .views import VoteView
urlpatterns = patterns('',
(r'^about/', login_required(TemplateView.as_view(template_name="secret.html"))),
(r'^vote/', permission_required('polls.can_vote')(VoteView.as_view())),
)
Украшение класса
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from django.views.generic import TemplateView
class ProtectedView(TemplateView):
template_name = 'secret.html'
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(ProtectedView, self).dispatch(*args, **kwargs)
Подробнее см. документацию, связанную выше.
Ответ 3
Общие представления изменились с функций на объекты с версией 1.3 Django. Таким образом, для Will McCutchen и Will Hardy требуется небольшое изменение для работы с версией 1.3:
from django.contrib.auth.decorators import login_required
from django.views.generic import TemplateView
urlpatterns = patterns('',
(r'^foo/$', login_required(TemplateView.as_view(template_name='foo_index.html'))),
)
Также в документации описано, как это сделать.
Ответ 4
Если вы не хотите писать свою собственную тонкую оболочку вокруг общих представлений, о которых идет речь (как предложил Амир), вы также можете сделать что-то вроде этого в вашем файле urls.py
:
from django.conf.urls.defaults import *
# Directly import whatever generic views you're using and the login_required
# decorator
from django.views.generic.simple import direct_to_template
from django.contrib.auth.decorators import login_required
# In your urlpatterns, wrap the generic view with the decorator
urlpatterns = patterns('',
(r'', login_required(direct_to_template), {'template': 'index.html'}),
# etc
)
Ответ 5
Для django 1.11 вы можете использовать LoginRequiredMixin для представлений на основе классов
в файле настроек вы должны добавить
LOGIN_URL="/login/"
в ваших views.py
from django.contrib.auth.mixins import LoginRequiredMixin
class RestaurantLocationCreateView(LoginRequiredMixin,CreateView):
....
Ответ 6
Мне нужен повторно используемый способ потребовать авторизацию во многих представлениях, полученных из общих представлений. Я создал функцию диспетчеризации замены, которую я могу добавить в свой класс вида так же, как и другие объявления.
class Index(generic.ListView):
model = models.HomePage
dispatch = auth.dispatch
auth.dispatch - это то, где мы делаем работу:
def dispatch(self, request, *args, **kw):
"""Mix-in for generic views"""
if userSession(request):
return super(self.__class__, self).dispatch(request, *args, **kw)
# auth failed, return login screen
response = user(request)
response.set_cookie('afterauth', value=request.path_info)
return response
Ответ 7
Используйте следующее:
from django.contrib.auth.decorators import login_required
@login_required
def your_view():
# your code here