Django REST Framework 入门

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.pyINSTALLED_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,分别实现 getpost 等方法。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
  • 实现 getpost 等方法。
  • course/urls.py 中通过 .as_view() 注册路由。

4-5 通用类视图

  • 继承自 generics 模块下的通用类。
  • 设置 queryset 和序列化器类(serializer_class)。
  • 如果创建实体时需要设置额外字段,可以重写 perform_create 方法。
  • 使用 .as_view() 配置路由。

4-6 视图集(ViewSets)

  • 定义类继承 viewsets.ModelViewSet,自动包含 listcreateretrieveupdatepartial_updatedestroy 一整套接口。
  • 设置 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")),