如何要求登录Django Generic Views?

ham*_*guz 78 python django

我想限制对Django Generic Views处理的URL的访问.

对于我的观点,我知道login_required装饰师完成了这项工作.同时创建/删除/更新通用视图接受login_required参数,但我找不到为其他通用视图执行此操作的方法.

Wil*_*rdy 98

对于Django <1.5,您可以通过在函数库中包装函数来添加装饰器,这允许您包装通用视图:

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'}),
    )
Run Code Online (Sandbox Code Playgroud)

基于函数的通用视图在Django 1.4中已弃用,并在Django 1.5中被删除.但同样的原则适用,只需使用login_required装饰器包装基于类的视图的视图函数:

login_required(TemplateView.as_view(template_name='foo_index.html'))
Run Code Online (Sandbox Code Playgroud)


Ham*_*ner 87

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'
Run Code Online (Sandbox Code Playgroud)

如果你使用的是旧版本的django,你可以使用django-braces中的几乎相同的mixin - Django版本基于django-braces版本. django-braces 1.4.x仍支持Django 1.4,因此您可以将它与旧版本一起使用.

较旧的方法

我在google搜索如何装饰基于类的视图时发现了这个问题,所以要为此添加答案:

有关装饰基于类的视图的文档部分对此进行了介绍.有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())),
)
Run Code Online (Sandbox Code Playgroud)

装修课程

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)
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅上面链接的文档.


Bri*_*her 38

通用视图已从功能更改为具有Django 1.3版本的对象.因此,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'))),
)
Run Code Online (Sandbox Code Playgroud)

此外,文档还描述了如何执行此操作.

  • 请读者考虑这个答案导致时间过去和软件发展.第一个解决方案不适合我. (2认同)

Wil*_*hen 12

如果您不想围绕有问题的通用视图编写自己的瘦包装器(如Aamir建议的那样),您也可以在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
)
Run Code Online (Sandbox Code Playgroud)


Nat*_*bov 8

对于django 1.11,您可以将LoginRequiredMixin用于基于类的视图

在设置文件中,您应该添加

LOGIN_URL="/login/"
Run Code Online (Sandbox Code Playgroud)

在你的views.py中

from django.contrib.auth.mixins import LoginRequiredMixin

class RestaurantLocationCreateView(LoginRequiredMixin,CreateView):
    ....
Run Code Online (Sandbox Code Playgroud)


Şaf*_*zer 5

另一种实现此目的的方法如下,我喜欢它与基于函数的视图完全相似,并且不需要修改urls.py或覆盖dispatch:

@method_decorator(login_required, name='dispatch')
class YourGenericViewSubclass(TemplateView):
    #
    # View methods
    #
Run Code Online (Sandbox Code Playgroud)


小智 5

在 Django =>3.0 中,它变得非常简单:

from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from django.views.generic import TemplateView

@method_decorator(login_required(login_url='/login/'), name='dispatch')
class ProtectedView(TemplateView):
    template_name = 'secret.html'
Run Code Online (Sandbox Code Playgroud)

供参考: https: //docs.djangoproject.com/en/3.0/topics/class-based-views/intro/#decorating-the-class