【问题标题】:Custom decorator for class based views in django rest frameworkdjango rest框架中基于类的视图的自定义装饰器
【发布时间】:2016-08-16 07:55:21
【问题描述】:

我的应用程序中的用户很少,例如 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',)

【问题讨论】:

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


    【解决方案1】:

    为此我想到的一种解决方法是继承 IsAuthenticated 类并将其传递给基于类的视图中的 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
    

    【讨论】:

      猜你喜欢
      • 2016-04-28
      • 2017-03-08
      • 2022-01-24
      • 1970-01-01
      • 2018-11-19
      • 2014-06-07
      • 2020-07-07
      • 1970-01-01
      • 2012-04-10
      相关资源
      最近更新 更多