如何在Django Rest Framework视图上要求身份验证?

yfwxisqw  于 2023-05-08  发布在  Go
关注(0)|答案(3)|浏览(108)

我正在尝试在特定视图中使用自定义登录url...

@login_required(login_url='/account/login/')
class home(APIView):
    renderer_classes = (TemplateHTMLRenderer,)

    def get(self, request, format=None):
        template = get_template(template_name='myapp/template.html')
        return Response({}, template_name=template.template.name)

。。。但追踪显示。。

File "django/core/handlers/base.py", line 132, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "django/contrib/auth/decorators.py", line 22, in _wrapped_view
    return view_func(request, *args, **kwargs)
TypeError: __init__() takes exactly 1 argument (2 given)

是否可以在基于类的视图中使用自定义login_required?

kninwzqo

kninwzqo1#

我想你正在搜索Django Rest Framework APIView。
您可以在这里使用权限类:http://www.django-rest-framework.org/api-guide/permissions/
在项目的seetings.py上:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    )
}

在你的代码中:

from rest_framework.permissions import IsAuthenticated

class home(APIView):
    renderer_classes = (TemplateHTMLRenderer,)
    permission_classes = (IsAuthenticated,)

    def get(self, request, format=None):
        template = get_template(template_name='myapp/template.html')
        return Response({}, template_name=template.template.name)
w80xi6nr

w80xi6nr2#

装饰器只能用在函数上,不能用在类上。
然而,对于装饰基于类的视图,django文档建议这样做:

装饰课堂

要装饰基于类的视图的每个示例,需要装饰类定义本身。为此,您将装饰器应用于类的dispatch()方法。
类上的方法与独立函数并不完全相同,因此您不能仅将函数装饰器应用于方法-您需要首先将其转换为方法装饰器。method_decorator装饰器将函数装饰器转换为方法装饰器,以便可以在示例方法上使用。例如:

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)
pftdvrlh

pftdvrlh3#

从Django 1.9开始,你可以选择使用Mixin来控制基于类的视图中的权限:
https://docs.djangoproject.com/en/1.9/releases/1.9/#permission-mixins-for-class-based-viewshttps://docs.djangoproject.com/en/1.9/topics/auth/default/#django.contrib.auth.mixins.LoginRequiredMixin

相关问题