在当今快速发展的开发世界中,能够快速构建可靠、可扩展且易维护的 API 是一项必备技能。Django Rest Framework(DRF)提供了一个强大而灵活的工具包,可以快速构建 Web API。本指南将带您从头开始,在不到 10 分钟内使用 DRF 创建一个 API。无论您是经验丰富的开发人员还是 Django 新手,本教程将帮助您快速掌握最佳实践。
1. Django Rest Framework 简介
Django Rest Framework(DRF)是一个构建在 Django 之上的开源框架,能够轻松创建 RESTful API。它简化了处理 HTTP 请求、数据库交互以及返回 JSON 等格式数据的复杂性。借助 DRF 的灵活模块化设计,您可以根据需要扩展和自定义框架,而无需重写现有功能。
2. 设置开发环境
在开始编写代码之前,我们需要准备好开发环境。确保系统已准备好运行 Django 项目。
2.1 安装 Python
如果尚未安装 Python,请访问 python.org 并下载最新的稳定版本(Python 3.10 或更高版本)。在安装过程中,确保将 Python 添加到系统的 PATH 中。
通过以下命令验证安装是否成功:
python --version
2.2 创建虚拟环境
使用虚拟环境可以将项目依赖与系统隔离开来,保持项目的独立性。通过以下命令创建虚拟环境:
python -m venv drf_env
激活虚拟环境:
- macOS/Linux 用户:
source drf_env/bin/activate
- Windows 用户:
drf_env\Scripts\activate
此时,终端提示符应显示虚拟环境的名称,表明已成功激活。
2.3 安装 Django 和 Django Rest Framework
激活虚拟环境后,运行以下命令安装 Django 和 DRF:
pip install django djangorestframework
这将安装 Django 和 DRF,提供构建 API 所需的库。
3. 创建 Django 项目
现在,开发环境已经准备好,我们可以创建一个 Django 项目来容纳我们的 API。
3.1 启动新项目
运行以下命令启动一个新项目:
django-admin startproject quickapi
cd quickapi
此命令将为您的 Django 项目创建基本结构,包括 settings.py 和 urls.py 等重要文件。
3.2 创建 Django 应用
Django 项目通常由应用程序(app)组成,应用是功能的模块化单元。在本例中,我们将创建一个名为 books 的应用:
python manage.py startapp books
随后,别忘了在 settings.py 中将该应用注册到 INSTALLED_APPS 中:
# 在 quickapi/settings.py 中
INSTALLED_APPS = [
# 默认的 Django 应用...
'rest_framework', # 添加 DRF 到已安装的应用
'books', # 添加 books 应用
]
4. 定义 API 模型
我们的 API 需要处理数据,在 Django 中,数据由模型表示。模型是直接映射到数据库表的 Python 类。
4.1 创建一个简单的模型
在 books/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()
def __str__(self):
return self.title
这里我们创建了一个 Book 模型,包含三个字段:title、author 和 publication_date,这些字段将在数据库中存储。
4.2 应用迁移
要将模型保存到数据库中,我们需要创建并应用迁移。迁移是 Django 跟踪模型更改并将其反映到数据库架构中的方式。运行以下命令:
python manage.py makemigrations
python manage.py migrate
这将为 Book 模型创建数据库架构。
5. 序列化模型
要通过 API 公开数据,我们需要将其转换(即 序列化)为 JSON 等格式。DRF 提供了一个强大的序列化框架来处理这项工作。
5.1 创建序列化类
在 books/serializers.py 中创建一个 BookSerializer 类,将 Book 模型转换为 JSON:
from rest_framework import serializers
from .models import Book
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ['id', 'title', 'author', 'publication_date']
此序列化器将处理将 Book 模型实例转换为 JSON 格式,并验证传入的数据。
5.2 理解序列化字段
默认情况下,ModelSerializer 会自动包含模型中的所有字段,除非另行指定。在此例中,我们明确定义了 id、title、author 和 publication_date。序列化字段可确保数据在通过 API 公开时得到验证。
6. 构建 API 视图
在 Django 中,视图负责处理传入的请求、与数据库交互并返回响应。DRF 提供了多种工具来简化这一过程。
6.1 使用通用视图
在 books/views.py 中创建一个简单的视图,允许列出所有书籍或创建新书籍:
from rest_framework import generics
from .models import Book
from .serializers import BookSerializer
class BookList(generics.ListCreateAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
ListCreateAPIView 是一个通用视图,处理列出和创建对象的操作。通过指定 queryset 和 serializer_class,DRF 自动处理大部分样板代码。
7. 配置 URL 路由
现在我们已经构建了视图,接下来需要将它与 URL 绑定,使外界可以访问到它。
7.1. 设置 URL 路由
创建一个 books/urls.py 文件,并添加以下代码:
from django.urls import path
from .views import BookList
urlpatterns = [
path('books/', BookList.as_view(), name='book-list'),
]
这将为我们的图书 API 端点创建一个路由。
7.2. 使用 DefaultRouter(适用于 ViewSets)
如果你使用的是 ViewSets,Django 的 DefaultRouter 会自动为所有可用操作(列出、检索、创建等)生成路由。
在 quickapi/urls.py 中,包含该应用的 URL:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('books.urls')),
]
8. 测试 API
在部署之前,确保 API 按预期工作至关重要。DRF 无缝集成了 Django 的测试工具,让我们可以直接测试 API 端点。
8.1. 使用 Django 内置测试客户端
在 books/tests.py 中为 BookList 视图创建一个测试用例:
from django.test import TestCase
from django.urls import reverse
from rest_framework import status
from rest_framework.test import APIClient
from .models import Book
class BookAPITest(TestCase):
def setUp(self):
self.client = APIClient()
self.book_data = {'title': 'Django for Beginners', 'author': 'William S. Vincent', 'publication_date': '2020-01-01'}
self.response = self.client.post(
reverse('book-list'),
self.book_data,
format="json")
def test_api_can_create_a_book(self):
self.assertEqual(self.response.status_code, status.HTTP_201_CREATED)
8.2. 进行 API 请求
手动测试 API 时,运行 Django 开发服务器:
python manage.py runserver
你现在可以通过 http://localhost:8000/api/books/ 访问你的 API。
9. 增强 API 功能
在基本 API 工作正常后,你可能想要添加一些高级功能,如过滤、搜索和分页,以提升用户体验。
9.1. 添加过滤和搜索
DRF 让在 API 中添加搜索功能变得很简单。在 books/views.py 中修改视图:
from rest_framework import filters
class BookList(generics.ListCreateAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
filter_backends = [filters.SearchFilter]
search_fields = ['author', 'title']
这允许用户通过查询参数(如 ?search=title)来按作者或标题搜索图书。
9.2. 实现分页
为防止客户端接收到过多数据,可以对 API 结果进行分页。在 quickapi/settings.py 中添加:
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 10
}
这样每页的响应数据将限制为 10 本书。
10. 保护 API
安全性是任何 API 的关键。DRF 提供了内置的身份验证和权限工具。
10.1. 添加身份验证
为了限制访问权限,可以在视图中添加身份验证类:
from rest_framework.authentication import SessionAuthentication, BasicAuthentication
class BookList(generics.ListCreateAPIView):
authentication_classes = [SessionAuthentication, BasicAuthentication]
这为 API 添加了基本的会话和用户名/密码身份验证。
10.2. 实施权限控制
要进一步控制访问,可以使用权限类。例如,限制只有已验证的用户才能访问 API:
from rest_framework.permissions import IsAuthenticated
class BookList(generics.ListCreateAPIView):
permission_classes = [IsAuthenticated]
11. 结论
恭喜!在不到 10 分钟内,你已经使用 Django Rest Framework 构建了一个功能齐全的 API。我们从环境设置开始,一直到实现过滤和身份验证等高级功能。DRF 的灵活性和易用性使其成为快速构建健壮 API 的绝佳选择。继续尝试,很快你就能构建具有更复杂功能的 API!