📌  相关文章
📜  django rest框架业务逻辑——Python(1)

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

Django REST Framework - 业务逻辑

Django REST Framework (DRF) 是一个基于 Django 平台的 WebAPI 框架,适用于构建 RESTful API。本文将介绍 DRF 的业务逻辑,包括序列化、视图、路由、认证和权限等。

序列化

序列化是将模型数据转换为 JSON 或者 XML 格式,在 DRF 中通常使用序列化器来实现。一个序列化器通常继承 serializers.Serializer,我们可以通过定义序列化字段对模型数据进行序列化,然后返回序列化的结果。下面是一个示例序列化器:

from rest_framework import serializers
from myapp.models import Book

class BookSerializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)
    title = serializers.CharField(max_length=256)
    author = serializers.CharField(max_length=256)
    description = serializers.CharField()
    price = serializers.DecimalField(max_digits=5, decimal_places=2)
    
    def create(self, validated_data):
        return Book.objects.create(**validated_data)

    def update(self, instance, validated_data):
        instance.title = validated_data.get('title', instance.title)
        instance.author = validated_data.get('author', instance.author)
        instance.description = validated_data.get('description', instance.description)
        instance.price = validated_data.get('price', instance.price)
        instance.save()
        return instance

在上面的序列化器中,我们定义了 idtitleauthordescriptionprice 等 5 个字段,并实现了create和update方法以支持 Create 和 Update 操作。

视图

在 DRF 中视图是用来处理 HTTP 请求的代码块,我们通常使用类视图来实现。下面是一个示例视图:

from rest_framework import generics
from myapp.models import Book
from myapp.serializers import BookSerializer

class BookListView(generics.ListCreateAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

class BookDetailView(generics.RetrieveUpdateDestroyAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

在上面的视图中,我们定义了 BookListView 类和 BookDetailView 类,分别用于处理书籍列表和书籍详情的请求。在类中我们定义了 querysetserializer_class 属性,用于指定查询数据和使用的序列化器。

路由

在 DRF 中,我们通常使用路由将请求映射到相应的视图处理函数上,DRF 支持多种路由方式,包括基于函数和基于类的视图。下面是一个示例路由:

from django.urls import path
from myapp.views import BookListView, BookDetailView

urlpatterns = [
    path('book/', BookListView.as_view()),
    path('book/<int:pk>/', BookDetailView.as_view())
]

在上面的路由中,我们定义了两个 URL 路径,分别映射到 BookListViewBookDetailView。在第二个 URL 中 <int:pk> 是一个参数,用于指定要操作的书籍的主键。

认证

DRF 提供了多种认证方式,例如 Basic、Token、JWT 等。下面是一个示例认证:

from rest_framework.authentication import SessionAuthentication, BasicAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView

class BookView(APIView):
    
    authentication_classes = [SessionAuthentication, BasicAuthentication]
    permission_classes = [IsAuthenticated]
    
    def get(self, request, format=None):
        # ...

在上面的代码中,我们定义一个 BookView 类,并指定了认证方式和权限。通过 authentication_classes 属性和 permission_classes 属性即可。在上面的示例中,我们同时使用了 SessionAuthentication 和 BasicAuthentication 进行认证,并使用 IsAuthenticated 权限要求用户进行身份验证才能访问视图函数。

权限

DRF 提供了多种权限方式,例如 AllowAny、IsAuthenticated、IsAdminUser、DjangoModelPermissions 等。下面是一个示例权限:

from rest_framework.permissions import IsAdminUser
from rest_framework.views import APIView

class BookView(APIView):
    permission_classes = [IsAdminUser]
    
    def get(self, request, format=None):
        # ...

在上面的代码中,我们定义了一个 BookView 类,并指定了只有管理员用户才有权限访问该 API 接口。

总结

本文介绍了 DRF 的业务逻辑,包括序列化、视图、路由、认证和权限等。通过本文的学习,相信读者已经掌握了 DRF 的核心概念和使用技巧,能够使用 DRF 高效地实现 WebAPI 功能。