Python 如何将Django REST API限制为只有一个用户?

Python 如何将Django REST API限制为只有一个用户?,python,django,django-rest-framework,django-rest-auth,Python,Django,Django Rest Framework,Django Rest Auth,我正在用Django编写一个RESTAPI,我需要将一些URL限制为只能使用它的创建者。我实际上使用的是身份验证令牌,但事实上任何拥有令牌的人都可以使用我的API,因此我需要将某些功能限制在特定用户 例如: Jonh Doe Token: roh2938rhe63eh0832yey3289 public --> domain.com/api/bobby/public/ public --> domain.com/api/jonhdoe/public/ private --> d

我正在用Django编写一个RESTAPI,我需要将一些URL限制为只能使用它的创建者。我实际上使用的是身份验证令牌,但事实上任何拥有令牌的人都可以使用我的API,因此我需要将某些功能限制在特定用户

例如:

Jonh Doe Token: roh2938rhe63eh0832yey3289
public --> domain.com/api/bobby/public/
public --> domain.com/api/jonhdoe/public/
private --> domain.com/api/jonhdoe/private/

尽管返回的数据与通常相同,但只是私有的,但不知何故,只有Jonh Doe才有权访问该私有URL。

每个用户都应该拥有其唯一的身份验证令牌。允许访问某些用户的方法是创建权限。Django中的权限用于验证用户是否有权执行某些操作。 Django创建权限的方法是在相关应用程序文件夹中创建
permissions.py
文件,并在该文件中编写继承
权限的权限类。BasePermission
类和重写
具有\u permission
方法,如果用户应该拥有权限或
False
否则。完成此操作后,只需将权限类添加到
权限类列表中即可

权限。py

from rest_framework import permissions


class IsPrivateAllowed(permissions.BasePermission):
    """
    Allow access to request owner
    """
    def has_permission(self, request, view):
        # return True if allowed else False
        # 'username' is the request url kwarg eg. bobby, jonhdoe
        return view.kwargs.get('username', '') == request.user.username
我们已创建
IsPrivateAllowed
权限。对于您的示例,您应该检查请求令牌是否与url中的name参数兼容。现在导入它并将其添加到基于类的视图的权限列表中:

. . .
from .permissions import IsPrivateAllowed

class PrivateAPIView(APIView):
    permission_classes = [IsAuthenticated, IsPrivateAllowed]
    . . .

这里发生的是当用户触发API调用时,Django将首先检查用户是否满足列表中的所有权限,如果满足,则用户将有权访问特定的API调用。

每个用户都应具有其唯一的身份验证令牌。允许访问某些用户的方法是创建权限。Django中的权限用于验证用户是否有权执行某些操作。 Django创建权限的方法是在相关应用程序文件夹中创建
permissions.py
文件,并在该文件中编写继承
权限的权限类。BasePermission
类和重写
具有\u permission
方法,如果用户应该拥有权限或
False
否则。完成此操作后,只需将权限类添加到
权限类列表中即可

权限。py

from rest_framework import permissions


class IsPrivateAllowed(permissions.BasePermission):
    """
    Allow access to request owner
    """
    def has_permission(self, request, view):
        # return True if allowed else False
        # 'username' is the request url kwarg eg. bobby, jonhdoe
        return view.kwargs.get('username', '') == request.user.username
我们已创建
IsPrivateAllowed
权限。对于您的示例,您应该检查请求令牌是否与url中的name参数兼容。现在导入它并将其添加到基于类的视图的权限列表中:

. . .
from .permissions import IsPrivateAllowed

class PrivateAPIView(APIView):
    permission_classes = [IsAuthenticated, IsPrivateAllowed]
    . . .
这里发生的是当用户触发API调用时,Django将首先检查用户是否满足列表中的所有权限,如果满足,则用户将有权访问特定的API调用