Подтвердить что ты не робот

Как требовать входа в Django Generic Views?

Я хочу ограничить доступ к URL-адресам, обрабатываемым Django Generic Views.

Для моих просмотров Я знаю, что login_required decorator выполняет эту работу. Также Create/Delete/Update Generic Views принимают аргумент login_required, но я не мог найти способ сделать это для других общих представлений.

4b9b3361

Ответ 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