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请求
    pass

def 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方法的访问权限。