python - 未调用 Django Rest Framework 自定义对象权限
问题描述
所以,我想制作匿名或非管理员只能发布的端点。端点是:
- api/v1/关键字/
- api/v1/关键字/$id
我已经获得了自定义权限并将其应用到基于类的视图中。
#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 一起使用?
解决方案
有两件事:
allowed_methods = ('POST',)
你忘记了逗号(如果没有逗号它只是字符串,但如果有逗号它是元组)
has_object_permissions - 当你想要获取对象而不是创建对象时,DRF 调用它。
推荐阅读
- javascript - 我想在 node.js 中创建一个目录结构 /A/B/file.js
- php - 更新适用于本地主机,但不适用于实时更新
- authentication - 如何使用 azure devops 构建管道对 npm 注册表进行身份验证?
- c# - 我们可以在 Visual Studio 中选择性地生成 XML 文档吗?
- laravel - laravel-如何在同一个视图中创建单独的注册表单?
- python - 将参数传递给 Django Modelform 的 Meta 类
- python - 如何使用 pyotp 为不同的用户生成不同的 OTP 令牌?
- java - 如何修复错误 No serializer found for class java.util.logging.SimpleFormatter and no properties found to create BeanSerializer
- angular - 在 Visual Studio Code 中为自定义 npm 包自动导入声明
- python - 读取串口输入