django permission_classes = [AllowAny] 如何限制到具体接口
在 Django REST framework (DRF) 中,permission_classes 用于定义哪些用户可以访问给定的视图。当你使用 AllowAny 作为权限类时,这表示任何用户都可以访问该视图,无论他们是否通过认证。如果你想限制访问到具体的接口,但又不想让任何用户都能访问,你可以使用其他权限类,例如 IsAuthenticated 或自定义权限类。
使用 IsAuthenticated
如果你希望只有已认证的用户才能访问某个接口,你可以将权限类设置为 IsAuthenticated。
from rest_framework.permissions import IsAuthenticated
class MyView(APIView):
permission_classes = [IsAuthenticated]
def get(self, request, *args, **kwargs):# 只有已认证的用户可以访问这个GET请求pass
自定义权限类
如果你需要更细粒度的控制,比如基于用户的角色或特定条件来限制访问,你可以创建一个自定义的权限类。
from rest_framework.permissions import BasePermission
class IsAdminOrReadOnly(BasePermission):
def has_permission(self, request, view):
if request.method in permissions.SAFE_METHODS:
return True
return request.user.is_staff
class MyView(APIView):
permission_classes = [IsAdminOrReadOnly]
def get(self, request, *args, **kwargs):# 任何用户都可以GET请求,但只有管理员可以POST、PUT、DELETE等请求pass
结合使用多个权限类
你也可以结合使用多个权限类,例如允许所有用户GET请求,但只有管理员可以POST请求。
from rest_framework.permissions import IsAuthenticated, AllowAny, IsAdminUser
from rest_framework import permissions
class MyView(APIView):
permission_classes = [AllowAny] # 允许所有用户GET请求
def get(self, request, *args, **kwargs):# 任何用户都可以GET请求passdef post(self, request, *args, **kwargs):# 只有管理员可以POST请求return self.permission_denied(request, message="仅管理员可以POST", code=403)
注意,在上面的代码中,我们实际上没有在 permission_classes 中直接设置 IsAdminUser 来限制POST方法,而是在POST方法内部手动返回权限拒绝。这是因为DRF不直接支持在单个视图中对不同HTTP方法应用不同的权限类。为了实现这一功能,你可以在方法内部进行权限检查,或者使用更高级的视图或路由配置方法(如方法装饰器)。例如:
from rest_framework.decorators import permission_classes
from rest_framework.permissions import IsAdminUser
class MyView(APIView):
permission_classes = [AllowAny] # 允许所有用户GET请求
@permission_classes([IsAdminUser])
def post(self, request, *args, **kwargs):# 只有管理员可以POST请求pass
这种方法使用了DRF的装饰器来为特定方法指定权限类。这样可以更灵活地控制不同HTTP方法的访问权限。