如何在 django 的类视图上进行身份验证

Posted

技术标签:

【中文标题】如何在 django 的类视图上进行身份验证【英文标题】:How can i put authentication on class views in django 【发布时间】:2012-12-28 04:15:33 【问题描述】:

在 Django 文档中,他们这样说 https://docs.djangoproject.com/en/dev/topics/auth/default/#user-objects

from django.contrib.auth.decorators import login_required

@login_required(login_url='/accounts/login/')
def my_view(request):

但是我如何在基于类的视图上使用 login_required

@login_required
classMyCreateView(CreateView):

这会出错

'function' object has no attribute 'as_view'

【问题讨论】:

查看***.com/a/35746181/456550了解当前(2019)的答案 【参考方案1】:

您可以通过多种方式做到这一点,例如

https://docs.djangoproject.com/en/dev/topics/class-based-views/#decorating-class-based-views

    要么这个
 urlpatterns = patterns('',
        (r'^about/', login_required(TemplateView.as_view(template_name="secret.html"))),
        (r'^vote/', permission_required('polls.can_vote')(VoteView.as_view())),
    )
    或者这个
class ProtectedView(TemplateView):
    template_name = 'secret.html'

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(ProtectedView, self).dispatch(*args, **kwargs)

【讨论】:

是否可以使用 urls.py 添加多个装饰器?【参考方案2】:

对于 Django 1.9 或更高版本;基于类的视图 (CBV) 可以利用 auth 包中的 mixin。只需使用以下语句导入 -

from django.contrib.auth.mixins import LoginRequiredMixin

mixin 是一种特殊的多重继承。使用mixin主要有两种情况:

    您想为一个类提供许多可选功能。 您想在许多不同的类中使用一个特定的功能。

了解更多:What is a mixin, and why are they useful?


CBV 使用 login_required 装饰器

urls.py

from django.conf.urls import url
from django.contrib.auth.decorators import login_required
from .views import ListSecretCodes

urlpatterns = [
    url(r'^secret/$', login_required(ListSecretCodes.as_view()), name='secret'),
]

views.py

from vanilla import ListView

class ListSecretCodes(LoginRequiredMixin, ListView):
    model = SecretCode

CBV 使用 LoginRequiredMixin

urls.py

from django.conf.urls import url
from .views import ListSecretCodes

urlpatterns = [
    url(r'^secret/$', ListSecretCodes.as_view(), name='secret'),
]

views.py

from django.contrib.auth.mixins import LoginRequiredMixin
from vanilla import ListView

class ListSecretCodes(LoginRequiredMixin, ListView):
    model = SecretCode

注意

以上示例代码使用django-vanilla 轻松创建基于类的视图(CBV)。使用 Django 的内置 CBV 和一些额外的代码行也可以达到同样的效果。

【讨论】:

以上是关于如何在 django 的类视图上进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章

静默刷新在 OPTIONS 预检上进行身份验证,但不在 GET 到 UserInfo 端点上进行身份验证

python 如何在django上使用身份验证简单地测试视图。

iOS Facebook SDK 在设备上进行身份验证后未重定向

在 Glassfish 上进行领域身份验证后重定向

令牌身份验证在 django rest 框架上的生产中不起作用

客户端是不是应该在每条路由上进行身份验证? [关闭]