我是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(),)
答案 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)
如果您正在编写自己的视图并希望强制执行对象级权限,或者在通用视图上覆盖get_object方法,那么您需要显式调用.check_object_permissions(request,obj) )您在检索对象时的视图上的方法。
因此,您需要明确调用权限检查。
请注意,如果您使用的是RetrieveAPIView而不是基于函数的视图,则可以免费获得。