Django REST Framework 入门
参考课程:https://www.imooc.com/learn/1274
常用命令:
python .\manage.py migrate
python .\manage.py createsuperuser
python .\manage.py runserver
3-1 课程信息模型类
搭建一个最小可用的 DRF 项目,主要步骤如下:
- 配置
settings.py:注册 app、设置时区等。 - 配置项目根
urls.py:加入 DRF 自带的登录路由。 - 在
course/models.py中定义数据模型的字段,以及Meta元信息。 - 在
course/apps.py中设置 app 名称。 - 在
course/admin.py中注册 course 模型,配置后台的展示、过滤、排序等。 - 在
tutorial/settings.py的INSTALLED_APPS中注册 course 应用。 - 执行
python .\manage.py migrate生成数据库表。
3-2 什么是序列化器
django.core.serializers 是 Django 自带的序列化器,但相比 DRF 的序列化器,有以下不足:
- 缺少对
request.data的验证处理 - 不支持验证器参数
- 不便同时序列化多个对象
- 序列化过程中难以添加上下文
- 缺少异常数据处理机制
3-3 如何序列化
- 在
course/serializers.py中自定义序列化器,并通过内部的Meta类指定包含的字段。 teacher字段是外键,需要单独自定义;通常将其设置为只读字段。
3-4 超链接序列化
在某些场景下,希望接口返回的不是关联对象的 id,而是它的 URL。这时可以使用超链接序列化:
- 序列化器继承
HyperlinkedModelSerializer。 - 在
fields中加入'url'字段。
4-1 使用 DRF 视图开发 RESTful API
DRF 提供了四种视图风格:
- 函数视图(FBV)
- 类视图(CBV)
- 通用类视图(generics)
- 视图集(ViewSets)
两种最基础的方式:
- FBV:定义函数,根据请求类型(GET、POST)分别处理。注意:POST 请求需要使用
csrf_exempt装饰器。 - CBV:定义类继承
View,分别实现get、post等方法。POST 同样需要csrf_exempt。
4-2 DRF 函数视图
实现步骤:
- 编写函数视图,使用
@api_view装饰器指定支持的请求类型。 - 使用序列化器在模型实例与字典数据之间转换(
instance <-> data)。POST 时可以开启部分更新;如果序列化器中某些字段是只读的,需要在save()时手动传入这些值。 - 在
course/urls.py中配置 app 路由。 - 在
tutorial/urls.py中注册 app 路由。
新增 detail 接口:
- 编写 detail 函数,使用
@api_view装饰。 - 在
course/urls.py中配置对应路由。
4-4 类视图编程
- 定义类继承
APIView。 - 实现
get、post等方法。 - 在
course/urls.py中通过.as_view()注册路由。
4-5 通用类视图
- 继承自
generics模块下的通用类。 - 设置
queryset和序列化器类(serializer_class)。 - 如果创建实体时需要设置额外字段,可以重写
perform_create方法。 - 使用
.as_view()配置路由。
4-6 视图集(ViewSets)
- 定义类继承
viewsets.ModelViewSet,自动包含list、create、retrieve、update、partial_update、destroy一整套接口。 - 设置
queryset和序列化器类。 - 若新建时需要设置
teacher等字段的值,仍然通过重写perform_create实现。
手动绑定路由:
path('viewsets/', CourseViewSet.as_view({"get": "list", "post": "create"}), name='viewsets-list'),
path('viewsets/<int:pk>/', CourseViewSet.as_view({
"get": "retrieve",
"put": "update",
"patch": "partial_update",
"delete": "destroy",
}), name='viewsets-detail'),
使用 DefaultRouter 自动生成路由会更简洁:
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register(prefix="viewsets", viewset=CourseViewSet)
# urlpatterns 中加上:
path('', include(router.urls)),
5-1 认证
DRF 内置常用认证方式:
- Basic 认证(用户名 + 密码)
- Session 认证
- Token 认证
认证 vs 权限:认证用于判断用户是否合法(你是谁),权限用于判断用户登录后能访问哪些接口(你能做什么)。
启用 Token 认证:
- 在
INSTALLED_APPS中加入rest_framework.authtoken。
6-1 API 文档
启用 DRF 自带的 schema 文档:
-
在配置中加入:
REST_FRAMEWORK = { "DEFAULT_SCHEMA_CLASS": "rest_framework.schemas.coreapi.AutoSchema", } -
在项目
urls.py中加入:from rest_framework.schemas import get_schema_view schema_view = get_schema_view(title="drf api doc") # urlpatterns 中加上: path('schema/', schema_view),
上述方式返回的是 JSON 格式的 schema,更方便阅读的方式是直接使用内置的可视化文档:
from rest_framework.documentation import include_docs_urls
path('docs/', include_docs_urls(title="drf api doc")),