@detail_route上的权限类不起作用,Django Rest Framework

时间:2016-10-24 19:32:57

标签: python django django-rest-framework

我是DRF的新手,但我尝试使用此堆栈线程中的方法在@detail_route上使用权限类:Using a permission class on a detail route

我的代码目前看起来像这样:

@detail_route(methods=['GET'], permission_classes=[IsStaffOrRestaurantUser])
def restaurant_dishes_ready_for_pickup(self, request, pk=None):
    ...stuff....

class IsStaffOrRestaurantUser(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        print(request)
        print(view)
        print(obj)
        return False

打印报表永远不会被执行......我可能遗漏了一些东西,但是我已经查看了文档并且无法弄明白,我的方法是否正确?谢谢!

编辑: 我在代码中已经意识到我们在Viewset中有这个片段,是否可以在装饰器中覆盖它?

def get_permissions(self):
    # Limit to listing and getting for non Admin user
    if self.request.method in permissions.SAFE_METHODS:
        return (permissions.AllowAny(),)

    return (IsAdminUser(),)

2 个答案:

答案 0 :(得分:1)

不确定它是否是最优雅的解决方案,但您可以像这样升级get_permissions()

def get_permissions(self):

    # check additional route specifics
    path = self.request.path
    if ("restaurant_dishes_ready_for_pickup" in path):
        return (IsStaffOrRestaurantUser,)

    # Limit to listing and getting for non Admin user
    if (self.request.method in permissions.SAFE_METHODS):
        return (permissions.AllowAny,)

    return (IsAdminUser,)

PS:也许可以返回权限类对象而不是get_permissions()中的实例。

答案 1 :(得分:1)

来自documentation

的引用
  

如果您正在编写自己的视图并希望强制执行对象级权限,或者在通用视图上覆盖get_object方法,那么您需要显式调用.check_object_permissions(request,obj) )您在检索对象时的视图上的方法。

因此,您需要明确调用权限检查。

请注意,如果您使用的是RetrieveAPIView而不是基于函数的视图,则可以免费获得。