【发布时间】:2014-06-30 14:35:36
【问题描述】:
我正在尝试使用 Rest Framework 实现 TokenAuthentication,但我似乎无法将我自己的自定义装饰器添加到我的 ViewSets 中,因为它们是在身份验证之前进行评估的。考虑一下:
from django.utils.decorators import method_decorator
from django.http.response import HttpResponseForbidden
def require_staff(View):
def staffOnly(function):
def wrap(request, *args, **kwargs):
if request.user.is_active and request.user.is_staff:
return function(request, *args, **kwargs)
else:
return HttpResponseForbidden()
return wrap
View.dispatch = method_decorator(staffOnly)(View.dispatch)
return View
当我尝试实现这一点时,似乎装饰器代码首先触发,因此永远不会运行身份验证。
@require_staff
class CustomerViewSet(ModelViewSet):
model = Customer
filter_class = CustomerFilter
filter_backends = (DjangoFilterBackend,)
由于 request.user 从未设置,因此引入装饰器会破坏身份验证。
我认为问题在于身份验证发生在 rest_frameworks dispatch() 函数中,如果身份验证在游戏后期完成,我不清楚如何添加额外的(比如)自定义安全性。
我在这里遗漏了什么,或者实现此自定义的正确方法是什么?
有人建议为此使用权限。我认为它们的意思是自定义 DRF 权限,对吧?
【问题讨论】:
标签: django django-views django-rest-framework