所以,我想在 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 会调用它。
