django rest 框架中基于 class 的视图的自定义装饰器
Custom decorator for class based views in django rest framework
我的应用程序中几乎没有用户说 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 中的一个访问我做的一类用户:
@permit(["A"])
def myview(request):
# return some reponse
这很好用,但我无法将其转换为基于 class 的视图。
我尝试装饰派发方法:
@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',)
我为此采取的一种解决方法是将 class 子 IsAuthenticated
class 并在基于 class 的视图中将其传递给 permission_classes或者作为基于函数的视图的装饰器
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
我的应用程序中几乎没有用户说 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 中的一个访问我做的一类用户:
@permit(["A"])
def myview(request):
# return some reponse
这很好用,但我无法将其转换为基于 class 的视图。
我尝试装饰派发方法:
@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',)
我为此采取的一种解决方法是将 class 子 IsAuthenticated
class 并在基于 class 的视图中将其传递给 permission_classes或者作为基于函数的视图的装饰器
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