Django REST Framework 完整介绍与入门指南 – wiki词典

Django REST Framework 完整介绍与入门指南

引言

在现代Web开发中,构建健壮、高效且易于维护的API是核心需求。Django,作为Python世界中最受欢迎的Web框架之一,以其“开箱即用”的特性和完善的功能赢得了众多开发者的青睐。然而,当涉及到构建RESTful API时,纯粹的Django可能显得力不从心。这时,Django REST Framework (DRF) 便应运而生。

Django REST Framework 是一个功能强大、灵活且高度可定制的工具包,它基于Django框架,旨在帮助开发者快速、高效地构建RESTful Web API。它提供了构建API所需的一切,包括序列化、认证、权限、视图、路由等,并以其著名的“可浏览API”界面极大地简化了API的测试和交互过程。

为什么选择DRF?

  • 与Django完美集成: DRF与Django紧密结合,可以直接利用Django的模型、ORM、认证系统和设置。
  • 快速开发: 提供了丰富的通用视图和序列化器,可以大大减少编写样板代码的工作量。
  • 功能强大: 内置了认证、权限、节流、过滤、分页等高级功能,满足企业级API的需求。
  • 可浏览API: 提供一个友好的Web界面,方便开发者和前端人员理解、测试和使用API。
  • 社区活跃: 拥有庞大的用户社区和详尽的文档,遇到问题时容易找到解决方案。
  • 灵活性: 高度可定制,允许开发者根据特定需求进行扩展和修改。

核心特性

DRF通过一系列精心设计的组件,极大地简化了API的开发过程。以下是其几个核心特性:

1. 序列化器 (Serializers)

序列化是DRF的核心概念之一。它负责将复杂的Django模型实例(或其他Python对象)转换为可以轻松传输的数据格式,如JSON或XML。反之,它也能将接收到的数据验证并转换回Django模型实例,以便保存到数据库。

  • 功能:
    • 序列化: 将Python对象转换为可传输的格式。
    • 反序列化: 将接收到的数据转换为Python对象,并进行数据验证。
    • 验证: 提供强大的数据验证机制。
  • ModelSerializer DRF提供了一个强大的ModelSerializer类,它可以根据Django模型自动生成序列化器字段,极大地简化了序列化器的编写。

2. 视图和视图集 (Views and ViewSets)

视图是处理HTTP请求并返回HTTP响应的地方。DRF提供了比Django原生视图更强大的API特定视图。

  • APIView DRF最基本的视图类,是DjangoView的子类。它提供了Request和Response对象,以及认证、权限和节流等功能。
  • GenericAPIView 继承自APIView,并集成了常用的列表、创建、检索、更新、删除等操作的逻辑。它通常与Mixin类结合使用,以快速构建CRUD功能。
  • ViewSets ViewSets将一组相关联的视图逻辑组合在一个类中,例如,一个ViewSet可以同时处理列表、详情、创建、更新和删除等操作。ModelViewSetViewSet的一个子类,它可以直接与Django模型关联,自动提供完整的CRUD功能。

3. 路由 (Routers)

当使用ViewSets时,DRF的路由系统能够自动为ViewSet生成URL模式,从而省去了手动配置大量URL的工作。

  • DefaultRouterSimpleRouter 两种常用的路由器,它们会自动检测ViewSet中定义的操作,并生成对应的URL。

4. 认证与权限 (Authentication & Permissions)

DRF提供了灵活且可扩展的认证和权限系统,以保护API资源。

  • 认证 (Authentication): 确定请求是谁发出的。DRF支持多种认证方式,如:
    • SessionAuthentication (基于Django会话)
    • TokenAuthentication (基于Token令牌)
    • BasicAuthentication (HTTP基本认证)
  • 权限 (Permissions): 确定已认证的用户是否有权执行特定操作。DRF内置了多种权限类,如:
    • AllowAny (允许所有请求)
    • IsAuthenticated (只允许认证用户)
    • IsAdminUser (只允许管理员用户)
    • IsAuthenticatedOrReadOnly (认证用户可读写,未认证用户只读)
    • 开发者也可以自定义权限类。

5. 可浏览API (Browsable API)

这是DRF最受欢迎的特性之一。它为Web API提供了一个美观且功能丰富的HTML界面,允许开发者和API使用者在浏览器中直接查看API端点、发送请求、查看响应,极大地提高了API的开发、测试和文档编写效率。

6. 分页 (Pagination)

当API返回大量数据时,分页是必不可少的。DRF提供了多种分页策略,以有效地处理和返回数据。

  • 内置分页类: PageNumberPaginationLimitOffsetPaginationCursorPagination

7. 请求与响应 (Requests & Responses)

DRF封装了Django原生的HttpRequestHttpResponse对象,提供了更高级和更易用的RequestResponse对象。

  • Request对象: 扩展了Django的HttpRequest,增加了对JSON、XML等多种内容类型的解析支持。
  • Response对象: 允许你返回任意Python数据,DRF会根据请求的Accept头部自动将其渲染为适当的内容类型(如JSON)。

入门指南:构建一个简单的图书API

接下来,我们将通过一个简单的示例来演示如何使用DRF构建一个RESTful API。

步骤1: 安装 DRF

首先,确保你已经安装了Django。然后,安装Django REST Framework:

bash
pip install djangorestframework

rest_framework 添加到你的Django项目的 settings.pyINSTALLED_APPS 中:

“`python

myproject/settings.py

INSTALLED_APPS = [
# …
‘rest_framework’,
‘myapp’, # 假设你的应用名为myapp
]
“`

步骤2: 创建Django项目与应用

如果你还没有Django项目,可以创建一个:

bash
django-admin startproject myproject .
python manage.py startapp myapp

步骤3: 定义模型

myapp/models.py 中定义一个简单的 Book 模型:

“`python

myapp/models.py

from django.db import models

class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=100)
publication_date = models.DateField()
isbn = models.CharField(max_length=13, unique=True)

def __str__(self):
    return self.title

“`

运行数据库迁移:

bash
python manage.py makemigrations
python manage.py migrate

步骤4: 创建序列化器

myapp 目录下创建一个 serializers.py 文件,并定义 BookSerializer

“`python

myapp/serializers.py

from rest_framework import serializers
from .models import Book

class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ‘all‘ # 序列化模型的所有字段
“`

步骤5: 编写视图集

myapp/views.py 中编写 BookViewSet

“`python

myapp/views.py

from rest_framework import viewsets
from .models import Book
from .serializers import BookSerializer

class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
“`

ModelViewSet 会自动为Book模型提供 list, create, retrieve, update, partial_updatedestroy 操作。

步骤6: 配置URL

首先,在 myproject/urls.py 中引入 rest_framework.routers 并配置应用的URL:

“`python

myproject/urls.py

from django.contrib import admin
from django.urls import path, include
from rest_framework import routers
from myapp.views import BookViewSet

创建一个路由器实例

router = routers.DefaultRouter()

注册BookViewSet到路由器

router.register(r’books’, BookViewSet)

urlpatterns = [
path(‘admin/’, admin.site.urls),
# 将路由器的URL包含进来
path(‘api/’, include(router.urls)),
# 可选:为DRF的认证视图添加URL,以便可浏览API可以使用登录/登出功能
path(‘api-auth/’, include(‘rest_framework.urls’, namespace=’rest_framework’)),
]
“`

步骤7: 运行服务器并测试

现在,运行Django开发服务器:

bash
python manage.py runserver

打开浏览器,访问 http://127.0.0.1:8000/api/,你将看到DRF的可浏览API界面,其中包含了 /api/books/ 端点。你可以通过这个界面进行图书的增删改查操作。

如果你访问 http://127.0.0.1:8000/api/books/,你可以看到所有图书的列表,并可以通过表单添加新图书。访问 http://127.0.0.1:8000/api/books/1/ (假设ID为1的图书存在) 则可以查看、修改或删除特定图书。

总结

Django REST Framework是Django开发者构建API的强大助手。它通过提供序列化、视图集、路由、认证和权限等一系列开箱即用的功能,极大地简化了API的开发流程。配合其独特的可浏览API界面,DRF不仅提升了开发效率,也改善了API的可用性和可测试性。

希望这篇入门指南能帮助你理解DRF的核心概念,并为你开启构建高效、优雅RESTful API的大门。DRF的功能远不止于此,鼓励你深入探索其官方文档,解锁更多高级特性!

滚动至顶部