我和Django -睡觉-框架里的BasePermission搞混了.

这里我定义了一个类:IsAuthenticatedAndOwner.

class IsAuthenticatedAndOwner(BasePermission):
    message = 'You must be the owner of this object.'
    def has_permission(self, request, view):
        print('called')
        return False
    def has_object_permission(self, request, view, obj):
        # return obj.user == request.user
        return False

views.py中使用

class StudentUpdateAPIView(RetrieveUpdateAPIView):
    serializer_class = StudentCreateUpdateSerializer
    queryset = Student.objects.all()
    lookup_field = 'pk'
    permissions_classes = [IsAuthenticatedAndOwner]

但它一点也不管用.每个人都可以传递权限并更新数据.

called元没有印出来.


我曾经定义过这个类:IsNotAuthenticated

class IsNotAuthenticated(BasePermission):
    message = 'You are already logged in.'
    def has_permission(self, request, view):
        return not request.user.is_authenticated()

它在功能上运行良好

class UserCreateAPIView(CreateAPIView):
    serializer_class = UserCreateSerializer
    queryset = User.objects.all()
    permission_classes = [IsNotAuthenticated]

那么,上面的例子和函数has_object_permission&has_permission有什么不同呢?

推荐答案

基本上,第一个代码否认一切,因为has_permission返回False.

has_permission是在拨打has_object_permission之前进行的判断.这意味着在你有任何机会判断所有权测试之前,你有need个人可以通过has_permission个人的许可.

你想要的是:

class IsAuthenticatedAndOwner(BasePermission):
    message = 'You must be the owner of this object.'
    def has_permission(self, request, view):
        return request.user and request.user.is_authenticated
    def has_object_permission(self, request, view, obj):
        return obj.user == request.user

这也将允许经过身份验证的用户创建新项目或列出它们.

Django相关问答推荐

如何在Django中将字段及其数据从一个模型添加到另一个模型?

如何显示日期?

AttributeError:';ManyToOneRel&39;对象没有属性';attname';

我希望用户能够预订相同的桌子,但不是在同一时间

基于Django类的视图:除非登录,否则拒绝访问future 日期

在 django 中使用自定义 url 转换器传递 url 参数

在Django Rest Framework中按模型属性排序时如何避免重新计算?

在 Django 模板中分页时如何正确显示与其父模型字段关联的所有内联字段?

Django ORM 和锁定表

Django中基于令牌的身份验证

如何从不是 django 元素文件夹的文件夹中运行 gunicorn

Django Facebook Connect 应用推荐

如何在 django 中生成 url

django - pisa:将图像添加到 PDF 输出

使用 XMLHttpRequest 提示下载文件

Django:从视图中添加 non_field_error?

如何在 Django 中测试自定义模板标签?

如何在 Django 中使用动态外键?

确保只有一个工作人员在运行多个工作人员的 pyramid 网络应用程序中启动 apscheduler 事件

如何获取 Django 模型字段对象的值