TLDR:如何使用Django Rest框架允许特定组访问视图?
我正在用Django Rest框架构建一个web服务。只有视图的一个(适当的)子集打算对客户可用。
到目前为止,我已经:
- 设置默认权限为
rest_framework.permissions.IsAdminUser
- 创建了一个名为
is_customer
的权限(使用Django管理网站) - 创建了一个名为
customers
的组,并将所有相关用户添加到该组(使用管理员网站) - 为
customers
添加了is_customer
权限(再次使用管理网站)
我所有的视图都是基于函数的。为了给customers
组提供适当的权限,我尝试了
from rest_framework.decorators import api_view
from django.contrib.auth.decorators import permission_required
@api_view(["POST"])
@permission_required(["is_customer"])
def my_func(request):
# calculations
return Response(...)
EDIT:也尝试了下面的方法
from rest_framework import permissions
from rest_framework.decorators import api_view
class IsCustomer(permissions.BasePermission):
def has_permission(self, request, view):
if request.user.is_customer:
return True
return False
def has_object_permission(self, request, view, obj):
if request.user.is_customer:
return True
return False
@api_view(["POST"])
@permission_required([IsCustomer])
def my_func(request):
# calculations
return Response(...)
和
from rest_framework.decorators permission_classes, api_view
@api_view(["POST"])
@permission_classes(["is_customer"])
def my_func(request):
# calculations
return Response(...)
似乎都不起作用。正确的做法是什么?提前感谢任何建议!
如果直接引用类,最后一个块应该可以工作:
from rest_framework.decorators permission_classes, api_view
@api_view(["POST"])
@permission_classes([IsCustomer])
def my_func(request):
# calculations
return Response(...)
你可以用一个类似的例子来查看文档:https://www.django-rest-framework.org/api-guide/permissions/
IsCustomer
类未正确设置。这个类应该是这样的:
class IsCustomer(permissions.BasePermission):
def has_permission(self, request, view):
if 'auth.is_customer' in request.user.get_all_permissions():
return True
return False
def has_object_permission(self, request, view, obj):
if 'auth.is_customer' in request.user.get_all_permissions():
return True
return False
从那里,使用@permission_classes([IsCustomer])
按预期工作。因此,视图的最终形式是:
@api_view(["POST"])
@permission_classes([IsCustomer])
def testing_post(request):
try:
someData = someCalculations()
return Response(data=someData, status=status.HTTP_200_OK)
except ValueError as e:
return Response(e.args[0], status.HTTP_400_BAD_REQUEST)