如何快速上手 Django REST Framework?实用指南
快速上手 Django REST Framework:实用指南
Django REST Framework (DRF) 是一个强大且灵活的工具包,用于构建 Web API。它基于 Django,继承了 Django 的许多优点,同时提供了专门为 API 开发设计的特性。如果你已经熟悉 Django,那么学习 DRF 会相对容易。即使你对 Django 不太了解,本指南也会从基础开始,帮助你快速上手。
1. 为什么选择 Django REST Framework?
在深入探讨如何使用 DRF 之前,让我们先了解一下为什么它是一个如此受欢迎的选择:
- 简化 API 开发: DRF 提供了序列化器(Serializers)、视图集(ViewSets)、路由(Routers)等高级抽象,大大简化了 API 的开发流程。
- 强大的序列化: 序列化器可以将复杂的 Django 模型数据转换为 JSON、XML 等格式,反之亦然。它们还可以处理数据验证和转换。
- 内置认证和权限: DRF 内置了多种认证和权限机制,如 Token 认证、Session 认证、OAuth2 等,可以轻松保护你的 API。
- 可浏览的 API: DRF 提供了一个可浏览的 API 界面,方便开发者测试和调试 API。
- 广泛的社区支持: DRF 拥有一个庞大而活跃的社区,你可以轻松找到文档、教程和帮助。
- 与 Django 无缝集成: DRF 与 Django 紧密集成,可以充分利用 Django 的 ORM、模板引擎等功能。
2. 准备工作:环境搭建
在开始编写代码之前,我们需要搭建开发环境。
2.1 安装 Python 和 pip
确保你的系统上安装了 Python(建议使用 Python 3.6 或更高版本)和 pip(Python 包管理工具)。你可以通过在终端中运行以下命令来检查:
bash
python --version
pip --version
2.2 创建虚拟环境(推荐)
为了隔离项目依赖,建议使用虚拟环境。你可以使用 venv
或 virtualenv
来创建虚拟环境。
使用 venv
(Python 3 内置):
bash
python3 -m venv myenv
使用 virtualenv
:
bash
pip install virtualenv
virtualenv myenv
激活虚拟环境:
-
Linux/macOS:
bash
source myenv/bin/activate
* Windows:bash
myenv\Scripts\activate
2.3 安装 Django 和 Django REST Framework
在虚拟环境激活的情况下,使用 pip 安装 Django 和 DRF:
bash
pip install django djangorestframework
2.4 创建 Django 项目和应用
现在,我们可以创建一个 Django 项目和一个应用:
bash
django-admin startproject myproject
cd myproject
python manage.py startapp myapp
3. 快速入门:构建一个简单的 API
让我们通过构建一个简单的图书管理 API 来快速体验 DRF 的核心功能。
3.1 定义模型 (models.py)
首先,在 myapp/models.py
中定义一个 Book
模型:
```python
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.CharField(max_length=100)
publication_date = models.DateField()
isbn = models.CharField(max_length=20, unique=True)
def __str__(self):
return self.title
```
3.2 创建序列化器 (serializers.py)
接下来,在 myapp
目录下创建一个 serializers.py
文件,并定义一个 BookSerializer
:
```python
from rest_framework import serializers
from .models import Book
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = 'all' # 或者指定需要的字段:['id', 'title', 'author', ...]
```
序列化器负责将模型实例转换为 JSON 格式,以及将 JSON 数据反序列化为模型实例。ModelSerializer
类会自动为模型字段创建序列化器字段。
3.3 创建视图 (views.py)
在 myapp/views.py
中,我们将使用 DRF 的 ListCreateAPIView
和 RetrieveUpdateDestroyAPIView
来快速创建视图:
```python
from rest_framework import generics
from .models import Book
from .serializers import BookSerializer
class BookListCreate(generics.ListCreateAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
class BookRetrieveUpdateDestroy(generics.RetrieveUpdateDestroyAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
```
BookListCreate
:处理图书列表的获取 (GET) 和创建 (POST) 请求。BookRetrieveUpdateDestroy
:处理单个图书的获取 (GET)、更新 (PUT/PATCH) 和删除 (DELETE) 请求。
3.4 配置 URL (urls.py)
在 myproject/urls.py
中,包含 myapp
的 URL 配置:
```python
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('myapp.urls')),
]
```
然后,在 myapp
目录下创建一个 urls.py
文件,并定义 API 的 URL 模式:
```python
from django.urls import path
from .views import BookListCreate, BookRetrieveUpdateDestroy
urlpatterns = [
path('books/', BookListCreate.as_view(), name='book-list'),
path('books/
]
```
注意:这里的pk指的是primary key,通常是一个自增的整数。
3.5 注册应用和 DRF
在 myproject/settings.py
的 INSTALLED_APPS
中添加 'rest_framework'
和 'myapp'
:
python
INSTALLED_APPS = [
# ...
'rest_framework',
'myapp',
]
3.6 数据库迁移
运行数据库迁移命令,创建 Book
模型对应的数据库表:
bash
python manage.py makemigrations
python manage.py migrate
3.7 运行开发服务器
现在,你可以启动开发服务器:
bash
python manage.py runserver
3.8 测试 API
打开浏览器或使用 API 测试工具(如 Postman),访问以下 URL:
http://127.0.0.1:8000/api/books/
: 获取图书列表(目前为空)。- 使用 POST 方法向
http://127.0.0.1:8000/api/books/
发送 JSON 数据创建图书。 http://127.0.0.1:8000/api/books/<id>/
: 获取、更新或删除指定 ID 的图书。
你会看到 DRF 自动生成的可浏览 API 界面,非常方便!
4. 进阶:DRF 的核心概念
在快速入门之后,让我们更深入地了解 DRF 的一些核心概念。
4.1 序列化器 (Serializers)
Serializer
类: 最基本的序列化器类,可以自定义字段和验证逻辑。ModelSerializer
类: 简化与 Django 模型关联的序列化器,自动生成字段。- 字段选项:
read_only
: 字段只读,不参与反序列化。write_only
: 字段只写,不参与序列化。required
: 字段是否必需。allow_null
: 字段是否允许为None
。default
: 字段的默认值。- 验证器 (Validators):自定义验证逻辑。
- 嵌套序列化器: 处理模型之间的关系(如一对多、多对多)。
4.2 视图 (Views)
- 基于函数的视图 (Function-Based Views): 使用
@api_view
装饰器将普通 Python 函数转换为 API 视图。 - 基于类的视图 (Class-Based Views):
APIView
:最基础的类视图,提供基本的 HTTP 方法处理。GenericAPIView
:提供通用行为(如分页、过滤)的基类。- Mixins: 提供通用操作(如列表、创建、检索、更新、删除)的 mixin 类。
- Concrete View Classes: 将
GenericAPIView
和 Mixins 组合起来的预构建视图类,如:ListAPIView
CreateAPIView
RetrieveAPIView
UpdateAPIView
DestroyAPIView
ListCreateAPIView
RetrieveUpdateAPIView
RetrieveDestroyAPIView
RetrieveUpdateDestroyAPIView
- 视图集 (ViewSets): 将一组相关的视图逻辑(如列表、创建、检索、更新、删除)组合到一个类中。
ViewSet
:最基本的视图集类。GenericViewSet
:提供通用行为的基类。ModelViewSet
:简化与 Django 模型关联的视图集,自动生成常用操作。
4.3 路由 (Routers)
SimpleRouter
: 提供基本的路由,适用于简单的 API。DefaultRouter
: 扩展了SimpleRouter
,添加了一个默认的 API 根视图。- 自定义路由: 可以使用
@action
装饰器在视图集中添加自定义路由。
4.4 认证 (Authentication)
SessionAuthentication
: 使用 Django 的 session 进行认证。BasicAuthentication
: 使用 HTTP Basic 认证。TokenAuthentication
: 使用 Token 进行认证(需要安装django-rest-framework-simplejwt
或类似的库)。OAuth2Authentication
: 使用 OAuth2 进行认证(需要安装django-oauth-toolkit
或类似的库)。- 自定义认证: 可以通过继承
BaseAuthentication
类来实现自定义认证。
4.5 权限 (Permissions)
AllowAny
: 允许任何用户访问。IsAuthenticated
: 只允许已认证的用户访问。IsAdminUser
: 只允许管理员用户访问。IsAuthenticatedOrReadOnly
: 允许已认证的用户进行所有操作,未认证的用户只能进行读取操作。- 自定义权限: 可以通过继承
BasePermission
类来实现自定义权限。
4.6 限流 (Throttling)
AnonRateThrottle
: 限制匿名用户的请求频率。UserRateThrottle
: 限制已认证用户的请求频率。ScopedRateThrottle
: 限制特定视图或操作的请求频率。- 自定义限流: 可以通过继承
BaseThrottle
类来实现自定义限流。
4.7 过滤 (Filtering)
django-filter
: 一个强大的过滤库,可以轻松实现各种过滤条件。SearchFilter
: 提供基于搜索的过滤。OrderingFilter
: 提供基于字段排序的过滤。
4.8 分页 (Pagination)
PageNumberPagination
: 基于页码的分页。LimitOffsetPagination
: 基于限制和偏移量的分页。CursorPagination
: 基于游标的分页,适用于大型数据集。
5. 高级主题
5.1 版本控制 (Versioning)
- URL 路径版本控制: 在 URL 中包含版本号(如
/api/v1/books/
)。 - 查询参数版本控制: 使用查询参数指定版本号(如
/api/books/?version=1
)。 - 请求头版本控制: 使用自定义请求头指定版本号。
- Accept 头版本控制: 使用 Accept 头指定版本号。
5.2 文档生成
drf-yasg
: 一个流行的 DRF 文档生成工具,可以生成 Swagger/OpenAPI 文档。drf-spectacular
另一个流行的DRF文档生成工具,生成的结果更加美观。
5.3 测试
APIClient
: DRF 提供的测试客户端,可以模拟 HTTP 请求。APITestCase
: DRF 提供的测试基类,简化 API 测试。
5.4 部署
- WSGI 服务器: 如 Gunicorn、uWSGI。
- Web 服务器: 如 Nginx、Apache。
- 云平台: 如 AWS、Google Cloud、Heroku 等。
6. 扬帆起航:开启你的 DRF 之旅
本指南涵盖了 Django REST Framework 的基础知识和核心概念,为你快速上手 DRF 提供了坚实的基础。
但是,掌握 DRF 并不仅仅是了解这些概念,更重要的是实践。建议你从一个小项目开始,逐步尝试 DRF 的各种功能,并结合官方文档和社区资源进行深入学习。