我正在尝试在特定视图中使用自定义登录网址
@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?
谢谢你!答案 0 :(得分:9)
装饰器只能用于函数,而不能用于类。
但是,对于装饰基于类的视图,django docs建议:
装饰课程
要装饰基于类的视图的每个实例,您需要进行装饰 类定义本身。要执行此操作,请将装饰器应用于 该课程的
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)
答案 1 :(得分:6)
我认为你正在寻找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)
答案 2 :(得分:1)