Django REST Framework 学习笔记(三):渲染模块 renders

  • Title(EN): Django REST Framework Learning Notes (3): the renders module
  • Author: dog2

用DRF做测试会发现,用浏览器请求API返回DRF定制的页面,对开发者相当友好,如下图:

而若使用python第三方模块requests或者postman等工具,这则返回的是原生的json数据。

实现这种差别响应的,正是本节的主角——(响应)渲染模块。

基本信息

  • 源码:rest_framework.renders
    • rest_framework.request.Request:主要类
  • 官方文档:API Guild - Renderers

源码分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 在`APIView`类的`dispatch`方法中,最后解析reponse对象数据
self.response = self.finalize_response(request, response, *args, **kwargs) #点进去

# 拿到运行的解析类的对象们
neg = self.perform_content_negotiation(request, force=True) #点进去

# 获得解析类对象
renderers = self.get_renderers() #点进去

# 从视图类中得到renderer_classes请求类,如何实例化一个个对象形参解析类对象列表
return [renderer() for renderer in self.renderer_classes] #配置文件

# self.renderer_classes为APIView类属性
renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES

# api_settings中的默认渲染类
'DEFAULT_RENDERER_CLASSES': [
'rest_framework.renderers.JSONRenderer',
'rest_framework.renderers.BrowsableAPIRenderer',
],

总结

调用链如下:

  1. 自己视图类的类属性(局部配置)
  2. APIView类的类属性设置
  3. 自己配置文件的DEFAULT_RENDERER_CLASSES(全局配置)
  4. drf配置文件的DEFAULT_RENDERER_CLASSES

用法示例

自定义全局配置

所有视图类统一处理,在项目的settings.py

1
2
3
4
5
6
7
REST_FRAMEWORK = {
# drf提供的渲染类
'DEFAULT_RENDERER_CLASSES': [
'rest_framework.renderers.JSONRenderer', #只显示出json数据
'rest_framework.renderers.BrowsableAPIRenderer', #渲染出页面,注意是BrowsableAPIRenderer
],
}

自定义局部配置

某一个或一些实体类单独处理,在views.py视图类中提供对应的类属性

1
2
3
4
5
6
7
8
9
10
11
# 在setting.py中配置REST_FRAMEWORK,完成的是全局配置,所有接口统一处理
# 如果只有部分接口特殊化,可以完成 - 局部配置
from rest_framework.renderers import JSONRenderer
class Test2(APIView):
# 局部配置
renderer_classes = [JSONRenderer]
def get(self, request, *args, **kwargs):
return Response('drf get ok 2')

def post(self, request, *args, **kwargs):
return Response('drf post ok 2')