Django REST Framework 入门指南
Django REST Framework (DRF) 是一个强大而灵活的工具包,用于构建 Web API。它建立在 Django 之上,极大地简化了 RESTful API 的开发。本指南将带你从零开始,快速构建一个简单的 REST API。
1. 前言:为什么选择 Django REST Framework?
在现代 Web 开发中,API 是前后端分离、移动应用、第三方集成等场景的核心。Django 本身提供了强大的 Web 开发能力,但如果需要构建一个与 Web 界面分离的、纯粹的 RESTful API,DRF 提供了以下优势:
- 易用性强: 提供了丰富的工具和抽象,减少了大量重复性工作。
- 高度可定制: 从序列化到视图,几乎所有组件都可以根据需求进行定制。
- 完善的文档和社区: 拥有活跃的社区和详尽的官方文档。
- 浏览器可浏览 API: 提供了一个美观且功能强大的浏览器可浏览 API,方便测试和调试。
- 认证与权限: 内置多种认证和权限机制。
2. 前置准备
在开始之前,请确保你的开发环境中已经安装了 Python 和 Django。
推荐的开发环境设置:
-
创建并激活虚拟环境:
“`bash
python -m venv venvWindows
.\venv\Scripts\activate
macOS/Linux
source venv/bin/activate
“` -
安装 Django 和 Django REST Framework:
bash
pip install Django djangorestframework
3. 创建 Django 项目和应用
我们将创建一个名为 myproject 的 Django 项目和一个名为 myapp 的应用。
-
创建 Django 项目:
bash
django-admin startproject myproject . -
创建 Django 应用:
bash
python manage.py startapp myapp -
注册应用和 REST Framework:
打开myproject/settings.py,在INSTALLED_APPS中添加rest_framework和myapp:“`python
myproject/settings.py
INSTALLED_APPS = [
‘django.contrib.admin’,
‘django.contrib.auth’,
‘django.contrib.contenttypes’,
‘django.contrib.sessions’,
‘django.contrib.messages’,
‘django.contrib.staticfiles’,
‘rest_framework’, # 添加这一行
‘myapp’, # 添加这一行
]
“` -
进行数据库迁移:
bash
python manage.py migrate
4. 定义模型 (Model)
在 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 myapp
python manage.py migrate
5. 创建序列化器 (Serializer)
序列化器负责将复杂的模型实例(或查询集)转换为原生 Python 数据类型,以便可以轻松地将其渲染为 JSON、XML 或其他内容类型。反之,它也可以将接收到的数据反序列化回模型实例。
在 myapp 文件夹中创建一个新文件 serializers.py:
“`python
myapp/serializers.py
from rest_framework import serializers
from .models import Book
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = [‘id’, ‘title’, ‘author’, ‘publication_date’, ‘isbn’]
# 或者使用 ‘all‘ 来包含所有字段
# fields = ‘all‘
“`
ModelSerializer 是一种快捷方式,它会自动为你创建与模型对应的字段,并实现 create() 和 update() 方法。
6. 创建视图 (View)
DRF 提供了多种视图类型,最常用的是基于类的视图(Class-Based Views)和视图集(ViewSets)。我们先从视图集开始,因为它结合了常用操作(CRUD)的逻辑。
使用 ViewSets 和 Routers
ViewSets 允许你将相关的逻辑组合到一个类中,通常用于处理一个模型的所有标准操作(列表、详情、创建、更新、删除)。Routers 负责自动为 ViewSets 生成 URL 模式,省去了手动编写 urls.py 的麻烦。
打开 myapp/views.py:
“`python
myapp/views.py
from rest_framework import viewsets
from .models import Book
from .serializers import BookSerializer
class BookViewSet(viewsets.ModelViewSet):
“””
允许用户查看或编辑图书的 API 终结点。
“””
queryset = Book.objects.all().order_by(‘title’)
serializer_class = BookSerializer
“`
ModelViewSet 继承自 GenericViewSet 并混合了 ListModelMixin, RetrieveModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin。这意味着它自动提供了创建、检索、更新、删除和列出模型实例的 API 接口。
7. 配置 URL 路由 (URL Routing)
现在我们需要将视图集与 URL 关联起来。我们将使用 DRF 的 DefaultRouter。
-
在
myapp中创建urls.py:“`python
myapp/urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import BookViewSetrouter = DefaultRouter()
router.register(r’books’, BookViewSet)urlpatterns = [
path(”, include(router.urls)),
]
“` -
在项目根
urls.py中包含myapp的 URL:“`python
myproject/urls.py
from django.contrib import admin
from django.urls import path, includeurlpatterns = [
path(‘admin/’, admin.site.urls),
path(‘api/’, include(‘myapp.urls’)), # 添加这一行
]
“`
现在,当你访问 /api/books/ 时,BookViewSet 将被用于处理请求。
8. 运行开发服务器
现在你可以启动 Django 开发服务器并测试你的 API 了:
bash
python manage.py runserver
打开浏览器,访问 http://127.0.0.1:8000/api/books/。
你将看到 DRF 提供的浏览器可浏览 API 界面。由于我们还没有添加任何图书,列表会是空的。
添加一些数据
为了测试,你可以通过 Django Admin 后台添加一些图书。
1. 创建超级用户:
```bash
python manage.py createsuperuser
```
-
注册
Book模型到 Admin:
打开myapp/admin.py:“`python
myapp/admin.py
from django.contrib import admin
from .models import Bookadmin.site.register(Book)
“` -
访问 Admin 后台:
现在访问http://127.0.0.1:8000/admin/,使用你创建的超级用户登录,然后添加几本图书。
再次访问 http://127.0.0.1:8000/api/books/,你会看到你添加的图书列表。你还可以尝试访问 http://127.0.0.1:8000/api/books/1/(如果 ID 为 1 的图书存在)来查看单个图书的详情。通过浏览器可浏览 API 界面,你还可以尝试发送 POST、PUT、PATCH、DELETE 请求来创建、更新和删除图书。
9. 认证和权限 (Authentication & Permissions)
API 的一个重要方面是控制谁可以访问什么数据。DRF 提供了灵活的认证和权限系统。
认证 (Authentication)
认证是识别请求发起者的过程。DRF 支持多种认证方案。
例如,要启用会话认证(通常用于与 Django 后台结合使用的 Web 应用)和基本认证(常用于客户端应用程序):
“`python
myproject/settings.py
REST_FRAMEWORK = {
‘DEFAULT_AUTHENTICATION_CLASSES’: [
‘rest_framework.authentication.SessionAuthentication’,
‘rest_framework.authentication.BasicAuthentication’,
]
}
“`
权限 (Permissions)
权限是确定请求的发起者是否有权执行特定操作的过程。DRF 提供了多种权限类。
例如,我们可能希望只有登录用户才能修改图书,而匿名用户只能查看。
“`python
myapp/views.py
from rest_framework import viewsets, permissions
from .models import Book
from .serializers import BookSerializer
class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.all().order_by(‘title’)
serializer_class = BookSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly] # 添加这一行
“`
IsAuthenticatedOrReadOnly 权限类允许所有经过认证的用户对对象进行完全访问(读取和写入),而未经认证的用户只能进行只读访问。
10. 总结与展望
恭喜你!你已经成功搭建了一个基于 Django REST Framework 的基本 API。这只是 DRF 功能的冰山一角。你可以继续探索:
- 更复杂的序列化器: 处理嵌套关系、自定义字段验证。
- 过滤、搜索、排序: 使用
django-filter进行高级查询。 - 分页: 处理大量数据,提高 API 响应速度。
- 自定义视图和 ViewSet: 根据特定需求调整行为。
- 更多认证方式: Token 认证、OAuth2 等。
- 测试 API: 编写单元测试和集成测试来确保 API 的健壮性。
DRF 是构建强大、可扩展的 Web API 的绝佳选择。祝你在使用它的旅程中一切顺利!