django rest框架中基于类的视图的自定义装饰器

时间:2016-04-22 15:35:51

标签: python django-rest-framework decorator django-authentication django-class-based-views

我的应用程序中的用户很少说A,B和C.一旦任何类型的用户进行身份验证,我都不希望此用户访问我的所有API

因此,对于基于函数的视图,我实现了一个装饰器:

from functools import wraps

from rest_framework import status
from rest_framework.response import Response


def permit(user_type):
    class Permission(object):

        def __init__(self, view_func):
            self.view_func = view_func
            wraps(view_func)(self)

        def __call__(self, request, *args, **kwargs):

            if request.user.user_type in user_type:
                return self.view_func(request, *args, **kwargs)
            else:
                return Response(status=status.HTTP_403_FORBIDDEN)

    return Permission

所以假设我希望我的一个API加入到我所做的A类用户中:

@permit(["A"])
def myview(request):
    # return some reponse

这很好但我无法将其转换为基于类的视图。

我试图装饰调度方法:

@method_decorator(permit_only(["A",]))
def dispatch(self, request, *args, **kwargs):
    return super(UserList, self).dispatch(*args, **kwargs)

但是我收到了一个错误:

AssertionError(u'.accepted_renderer not set on Response',)

1 个答案:

答案 0 :(得分:0)

我为此提出的解决方法之一是将IsAuthenticated类子类化为此类并将其传递给CBV中的permission_classes或作为FBV的装饰器

class PermA(IsAuthenticated):

    def has_permission(self, request, view):
        resp = super(PermA, self).has_permission(request, view)
        return getattr(request.user, "user_type", None) == "A" and resp
相关问题