Django Rest框架和权限
问题描述:
我已经通过几个StackOverflow线程读过,但无法达到任何满意的工作解决方案。 我想有几个自定义权限,或多或少复杂(从ReadOnly到,限制用户...)。Django Rest框架和权限
让我们先用我现在所拥有的:
- 一个基类,只读
- 我的设置
- 为用户视图集。
- 和staff_user,谁,让我们崩溃的一切
我的基类的样子:
class ReadOnly(permissions.BasePermission):
"""
Only, always, ever allow read-only access.
"""
def has_permission(self, request, view):
if request.method in permissions.SAFE_METHODS:
return True
return False
,并相应地由例如用户的视图集中
class UserViewSet(viewsets.ModelViewSet):
"""
Retrieve the user associated with your session and allow all methods.
"""
serializer_class = UserSerializer
permission_classes = (ReadOnly,)
def get_queryset(self):
return User.objects.filter(id=self.request.user.id) # This should return an empty queryset when not logged in
及相应的秋天innerhited - 默认权限为
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'api.permissions.ReadOnly'
]
}
当我现在访问用户页面并以员工身份登录时,我可以通过POST轻松创建用户,同样适用于所有其他视图集。这里发生了什么?
答
我有肠道远一点的问题.. 所以,这里是我的一个更复杂的权限代码:
class IsCurrentUserOrDeny(permissions.BasePermission):
"""
Allow the current user to edit his own user object
"""
def has_object_permission(self, request, view, obj):
return False
if request.method in permissions.SAFE_METHODS:
return obj == request.user
return False
def has_permission(self, request, view):
return True
显然,使用ModelViewSet将无法查找has_object_permissions方法。将has_permissions更改为False会拒绝所有请求(如预期的那样)。文档告诉
注意:只有在视图级别has_permission检查已通过时才会调用实例级别的has_object_permission方法。还要注意,为了运行实例级检查,视图代码应该显式调用.check_object_permissions(request,obj)。如果您使用的是通用视图,那么默认情况下会为您处理。
由于ModelViewSet是从GenericViewApi inerhits一个构成的一类,预期的行为将是:
- 请检查是否has_permissions返回True
- =>请检查是否has_object_permissions返回True
但事实并非如此。这里有什么问题?
您粘贴的代码*确实可以正常工作。 – Linovia