如何在django rest视图中使用login_required

ale*_*.tu 10 python django django-rest-framework

我试图在特定视图中使用自定义登录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)
Run Code Online (Sandbox Code Playgroud)

但追溯显示

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

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

谢谢!

Lei*_*all 10

装饰器只能用于函数,而不能用于类.

但是,为了装饰基于类的视图,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)
Run Code Online (Sandbox Code Playgroud)


Geo*_*cob 9

我想你正在寻找django休息框架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)
Run Code Online (Sandbox Code Playgroud)