Django:一个端点,POST对所有人开放,GET需要身份验证

42fyovps  于 2023-04-13  发布在  Go
关注(0)|答案(2)|浏览(93)

使用最新的Django/Django Rest框架。
我不知道如何允许一个端点具有以下规则:
POST -对任何人开放(AllowAny权限)GET -已验证。
没有办法根据方法来设置条件权限,所以只有一种方法可以在像这样的每个视图上更改权限:

@api_view(['POST'])
@permission_classes([AllowAny])
def users_view(request):
    return Response("Okay!")

当然没有办法做到这样的事情:

# I have authentication turned on by default in my settings.py file 

@api_view(['GET'])
def users_view(request):
    return Response("Okay - you're authenticated")

@api_view(['POST'])
@permission_classes([AllowAny])
def users_view(request):
    return Response("Okay! this is a public endpoint")

我该怎么做?

rdlzhqv9

rdlzhqv91#

所以我最终做了这样的事情:

class AllowPostOnlyPermission(BasePermission):
    """
    The request is permitted only if the method is POST
    """

    def has_permission(self, request, view):
        if (request.method == 'POST' or
                request.user and request.user.is_authenticated()):
                return True
        return False

我简单地补充了一下:

@api_view(['POST', 'GET'])
@permission_classes([AllowPostOnlyPermission])
def users_view(request):
    if request.method == 'GET':
        return Response("Okay GET")
        pass
    elif request.method == 'POST':
        return Response("Okay POST")

现在我的非凭证请求在GET上失败,但在POST上成功。

nvbavucw

nvbavucw2#

您的解决方案是可以的,但在has_permission方法中有一个小的调整。

def has_permission(self, request, view):
    if (request.method == 'POST' or
            request.user and request.user.is_authenticated**()**):
            return True
    return Falseenter code here

我把它改成了这个

def has_permission(self, request, view):
    if (request.method == 'POST' or
            request.user and request.user.is_authenticated):
            return True
    return Falseenter code hereenter code here

相关问题