首页 > 解决方案 > 未调用 Django Rest Framework 自定义对象权限

问题描述

所以,我想制作匿名或非管理员只能发布的端点。端点是:

我已经获得了自定义权限并将其应用到基于类的视图中。

#permissions.py
from rest_framework import permissions

class AnonWriteOnly(permissions.BasePermission):
    """
    Anon can only post
    """
    def has_object_permission(self, request, view, obj):
        # Only allow post request
        allowed_methods = ('POST')  
        if request.method in allowed_methods:
            print (True) #debugging purpose
            return True
        print(False) #debugging purpose
        return permissions.IsAuthenticated.has_permission(self, request, view)

这是我的看法:

# Anon can post.

#Corresponds to the first endpoint
class KeywordList(generics.ListCreateAPIView):
    """
    List all keywords, or create a new keyword
    """
    permission_classes = [AnonWriteOnly]
    queryset = Keyword.objects.all()   
    serializer_class = KeywordSerializer

#Corresponds to the second endpoint
class KeywordDetail(generics.RetrieveDestroyAPIView):
    """
    Retrieve, update, delete keyword
    """
    permission_classes = [AnonWriteOnly]
    queryset = Keyword.objects.all()
    serializer_class = KeywordSerializer

当我没有登录并尝试打开第二个端点时,它工作正常。它有 403 响应,输出也被打印出来。

False
[27/May/2018 18:14:33] "GET /api/v1/keyword/1 HTTP/1.1" 403 10621

但是,当我尝试打开第一个端点时,它不会打印任何东西,它只是正常运行,未经许可。

[27/May/2018 18:28:02] "GET /api/v1/keywords/ HTTP/1.1" 200 13256

我试图将 permissions.IsAuthenticated 更改为 permissions.IsAdminUser 但仍然没有运气。

但是,通过覆盖 has_permission 可以正常工作

from rest_framework import permissions

class AnonWriteOnly(permissions.BasePermission):
    """
    Anon can only post
    """
    def has_permission(self, request, view):
        # Only allow post request
        allowed_methods = ('POST')  
        if request.method in allowed_methods:
            print (True)
            return True
        print(False)
        return request.user.is_staff

为什么它不能与 has_object_permission 一起使用?

标签: pythondjangodjango-rest-framework

解决方案


有两件事:

allowed_methods = ('POST',) 

你忘记了逗号(如果没有逗号它只是字符串,但如果有逗号它是元组)

has_object_permissions - 当你想要获取对象而不是创建对象时,DRF 调用它。


推荐阅读