📜  djangobook.com jwd django restfremwork 插件 - Python (1)

📅  最后修改于: 2023-12-03 15:00:27.787000             🧑  作者: Mango

Django Rest Framework 插件介绍

简介

Django Rest Framework 是 Django 的一个扩展插件,它提供了快速构建 RESTful Web APIs 的功能,使开发者只需关注数据的处理和业务逻辑的实现,无需关心请求和响应的处理。

本文就 Django Rest Framework 插件的常见用法和实现方法做详细介绍。

安装

在使用 Django Rest Framework 插件之前,需要先安装该插件。

pip install djangorestframework

安装完成后,在项目的 settings.py 文件中添加以下代码:

INSTALLED_APPS = [
    ...
    'rest_framework',
    ...
]
序列化器

Django Rest Framework 插件中最常用的组件是序列化器,它用于将 Python 中的对象序列化成字符流或二进制流,以便于在网络上传输。

比如定义如下的一个人员信息的对象:

class Person:
    def __init__(self, name, age, gender, hobbies):
        self.name = name
        self.age = age
        self.gender = gender
        self.hobbies = hobbies

我们希望将其序列化成如下的 JSON 格式:

{
    "name": "Tom",
    "age": 20,
    "gender": "male",
    "hobbies": ["reading", "music"]
}

可以通过如下的序列化器定义实现:

from rest_framework import serializers

class PersonSerializer(serializers.Serializer):
    name = serializers.CharField(required=True, max_length=100)
    age = serializers.IntegerField(required=True)
    gender = serializers.ChoiceField(required=True, choices=["male", "female"])
    hobbies = serializers.ListField(child=serializers.CharField())

在视图中可以通过如下方式使用序列化器:

class PersonView(APIView):
    def get(self, request):
        person = Person(name="Tom", age=20, gender="male", hobbies=["reading", "music"])
        serialized_person = PersonSerializer(instance=person)
        return Response(serialized_person.data)
视图集

视图集是 Django Rest Framework 插件中另一个重要的组件,它用于定义 CRUD 操作的视图函数。

比如定义如下的一个人员信息的模型:

class Person(models.Model):
    name = models.CharField(max_length=100)
    age = models.IntegerField()
    gender = models.CharField(max_length=10)
    hobbies = models.TextField()

    def __str__(self):
        return self.name

可以定义如下的视图集:

from rest_framework import viewsets
from rest_framework.response import Response

class PersonViewSet(viewsets.ModelViewSet):
    queryset = Person.objects.all()
    serializer_class = PersonSerializer

    def retrieve(self, request, *args, **kwargs):
        instance = self.get_object()
        serializer = self.get_serializer(instance)
        data = {
            "person": serializer.data,
            "message": "retrieved successfully"
        }
        return Response(data)
路由配置

在 Django Rest Framework 插件中,路由配置不同于 Django 原生的 URLconf,它支持将视图和视图集进行绑定,并提供了如下的路由类:

  • SimpleRouter:支持默认的 CRUD 操作
  • DefaultRouter:在 SimpleRouter 的基础上支持“用户注册”和“密码重置”等额外的路由规则

配置路由的方式如下:

from rest_framework.routers import SimpleRouter

router = SimpleRouter()
router.register(r'persons', PersonViewSet)
urlpatterns = router.urls
验证器

Django Rest Framework 插件提供了一系列的验证器,用于对请求参数做校验。

比如需要校验请求中传入的 name 字段是否符合要求,可以通过定义如下的验证器实现:

class NameValidator:
    def __call__(self, value):
        if len(value) < 5:
            raise serializers.ValidationError('Name is too short')
        return value

然后在序列化器的 name 字段中使用该验证器:

name = serializers.CharField(validators=[NameValidator()])
总结

Django Rest Framework 插件极大地简化了 RESTful Web APIs 的开发过程,提高了开发效率和代码可读性,是 Django 开发者不可或缺的一个扩展。