欢迎访问宙启技术站
智能推送

使用DjangoModelPermissions()控制DjangoREST框架API的访问权限

发布时间:2023-12-26 01:52:52

使用DjangoModelPermissions()能够根据模型的权限设置来控制Django REST框架API的访问权限。该权限类允许对模型执行的增删改查操作进行权限检查,并且只允许具有相应权限的用户执行这些操作。

下面是一个使用DjangoModelPermissions()控制API访问权限的示例:

1. 安装相关库

在开始之前,我们需要安装相关的库。在虚拟环境中执行以下命令:

pip install djangorestframework

2. 配置Django REST框架

在Django项目的settings.py文件中进行如下配置:

INSTALLED_APPS = [
    ...
    'rest_framework',
    ...
]

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
        'rest_framework.permissions.DjangoModelPermissions',
    ],
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.TokenAuthentication',
    ],
}

在上述配置中,我们将权限类设置为IsAuthenticated和DjangoModelPermissions。IsAuthenticated用于仅允许已通过身份验证的用户访问API,而DjangoModelPermissions用于根据模型的权限设置来控制API的访问权限。

3. 创建模型和视图

创建一个简单的模型和视图来演示API的访问权限。在Django项目的models.py文件中添加如下模型:

from django.db import models

class Task(models.Model):
    title = models.CharField(max_length=100)
    description = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

接下来,在Django项目的views.py文件中添加如下视图:

from rest_framework import viewsets
from .models import Task
from .serializers import TaskSerializer

class TaskViewSet(viewsets.ModelViewSet):
    queryset = Task.objects.all()
    serializer_class = TaskSerializer

在上述视图中,我们使用了Django REST框架的ModelViewSet类,它提供了CRUD操作的默认实现。

4. 创建序列化器

在Django项目的serializers.py文件中添加如下序列化器:

from rest_framework import serializers
from .models import Task

class TaskSerializer(serializers.ModelSerializer):
    class Meta:
        model = Task
        fields = '__all__'

在上述序列化器中,我们使用了Django REST框架的ModelSerializer类来自动处理模型实例的序列化和反序列化操作。

5. 运行服务器

在终端中执行以下命令以运行Django开发服务器:

python manage.py runserver

6. 测试API权限

现在,我们可以使用curl命令或其他HTTP客户端工具来测试API的权限。假设我们有两个用户,分别是admin和user。admin用户具有完全访问权限,而user用户只具有只读权限。

首先,确保我们已经在Django认证系统中创建了这两个用户。

- 创建任务:

使用curl命令创建一个新的任务:

$ curl -X POST -d "title=Task 1&description=This is task 1" -H "Authorization: Token admin_token" http://localhost:8000/tasks/

这将创建一个名为"Task 1"的新任务。请注意,我们在请求头中包含了admin用户的令牌以进行身份验证。

- 更新任务:

使用curl命令更新刚才创建的任务:

$ curl -X PUT -d "title=Updated Task 1" -H "Authorization: Token admin_token" http://localhost:8000/tasks/1/

这将修改id为1的任务的标题为"Updated Task 1"。同样地,我们在请求头中包含了admin用户的令牌。

- 删除任务:

使用curl命令删除id为1的任务:

$ curl -X DELETE -H "Authorization: Token admin_token" http://localhost:8000/tasks/1/

这将删除id为1的任务。

- 获取任务列表:

使用curl命令获取所有任务的列表:

$ curl -X GET -H "Authorization: Token user_token" http://localhost:8000/tasks/

这将返回任务的JSON列表。请注意,我们在请求头中包含了user用户的令牌。

通过以上步骤,我们可以根据用户的权限来管理API的访问。admin用户可以创建、更新和删除任务,而user用户只能获取任务列表。根据模型的权限设置,DjangoModelPermissions()确保了只有具有相应权限的用户才能执行相应的操作。