Skip to main content
 首页 » 编程设计

python之未调用 Django Rest Framework 自定义对象权限

2024年09月07日33tintown

所以,我想在 Anon 或非管理员只能 POST 的地方创建端点。 端点是:

  • api/v1/关键字/
  • api/v1/关键字/$id

我已经创建了自定义权限并将其应用到基于类的 View 中。

#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 

我已经尝试更改权限。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?

请您参考如下方法:

有两件事:

allowed_methods = ('POST',)  

你忘了逗号(没有逗号就是字符串,有逗号就是元组)

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