在当今的 Web 开发中,构建 RESTful API 已经成为连接前后端不可或缺的一环。Django REST Framework(DRF)是一个强大而灵活的工具包,用于构建 Web APIs。它基于 Django 框架之上,提供了简单且可扩展的方式,让开发者能够快速地创建出功能丰富的 API。
本文将带你从零开始,使用 Django REST Framework 创建一个简单的博客应用 API,涵盖模型设计、序列化器、视图集、路由配置以及权限管理等内容。
一、安装与配置 Django REST Framework
首先确保你已经安装了 Django 并创建了一个项目。接下来我们来安装 DRF:
pip install djangorestframework
然后,在你的 settings.py
文件中的 INSTALLED_APPS
列表里添加 'rest_framework'
:
INSTALLED_APPS = [
...
'rest_framework',
]
二、创建博客应用
假设你已经有了一个名为 blog
的应用,我们将在此基础上构建我们的 API。
1. 定义模型
在 models.py
中定义文章和作者的模型:
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
author = models.ForeignKey(Author, on_delete=models.CASCADE)
published_date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
运行迁移命令以创建数据库表:
python manage.py makemigrations
python manage.py migrate
三、序列化数据
为了将 Django 模型转换为 JSON 格式,我们需要使用 DRF 提供的序列化器。
1. 创建序列化器
在 blog
应用下新建一个 serializers.py
文件,并定义如下内容:
from rest_framework import serializers
from .models import Post, Author
class AuthorSerializer(serializers.ModelSerializer):
class Meta:
model = Author
fields = ['id', 'name']
class PostSerializer(serializers.ModelSerializer):
author = AuthorSerializer()
class Meta:
model = Post
fields = ['id', 'title', 'content', 'author', 'published_date']
这里我们定义了两个序列化器:一个是针对 Author
模型的 AuthorSerializer
,另一个是针对 Post
模型的 PostSerializer
,其中包含了对 Author
的嵌套序列化。
四、编写视图
DRF 提供了两种主要的方式来定义视图:基于函数的视图和基于类的视图。在这里,我们将使用视图集(ViewSets),这是一种更加简洁和强大的方式。
1. 创建视图集
在 views.py
中添加以下代码:
from rest_framework import viewsets
from .models import Post, Author
from .serializers import PostSerializer, AuthorSerializer
class AuthorViewSet(viewsets.ModelViewSet):
queryset = Author.objects.all()
serializer_class = AuthorSerializer
class PostViewSet(viewsets.ModelViewSet):
queryset = Post.objects.all()
serializer_class = PostSerializer
五、配置 URL 路由
为了让 API 可访问,我们需要设置相应的路由。
在 urls.py
中进行如下修改:
from django.urls import include, path
from rest_framework.routers import DefaultRouter
from blog.views import AuthorViewSet, PostViewSet
router = DefaultRouter()
router.register(r'authors', AuthorViewSet)
router.register(r'posts', PostViewSet)
urlpatterns = [
path('', include(router.urls)),
]
这样我们就设置了两个基本的路由 /authors/
和 /posts/
,分别对应作者和文章的操作。
六、测试 API
启动 Django 开发服务器:
python manage.py runserver
现在你可以通过浏览器或 POSTMAN 等工具访问 API 接口了。例如:
- 获取所有文章列表:
GET http://localhost:8000/posts/
- 创建新文章:
POST http://localhost:8000/posts/
- 更新一篇文章:
PUT http://localhost:8000/posts/{id}/
- 删除一篇文章:
DELETE http://localhost:8000/posts/{id}/
七、添加认证和权限
对于大多数 API 来说,控制谁可以访问特定资源是非常重要的。DRF 提供了多种认证方式和权限策略。
1. 配置全局认证
在 settings.py
中添加:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
}
这将启用基本的身份验证和会话身份验证,并要求所有用户必须已登录才能访问 API。
2. 自定义权限
如果你想对不同的视图设置不同的权限,可以在对应的视图集中指定 permission_classes
属性。
from rest_framework.permissions import IsAdminUser
class PostViewSet(viewsets.ModelViewSet):
...
permission_classes = [IsAdminUser] # 只有管理员可以编辑帖子
八、总结
通过本教程,你应该已经学会了如何使用 Django REST Framework 快速搭建一个 RESTful API。我们覆盖了从环境准备、模型定义、序列化器编写、视图集实现到路由配置的基础知识,并介绍了如何添加认证和权限保护。
当然,DRF 还有许多高级特性等待你去探索,如分页、过滤、自定义动作等。希望这篇文章能帮助你在开发过程中更好地理解和运用这些概念。
参考资料
Quickstart - Django REST framework