drf的渲染模块
drf的渲染模块(了解)
- 可以在视图类中通过renderer_classes类属性对该视图的数据响应渲染做配置 - 局部配置
- 可以在项目的配置文件的drf配置中通过DEFAULT_RENDERER_CLASSES对该视图的数据响应渲染做配置 - 全局配置
注:如果一个视图类在有全局配置下,还进行了局部配置,优先走自己的局部配置
drf 必须要进行配置
INSTALLED_APPS = [
...
'rest_framework'
]
局部配置
直接在类中进行配置
from rest_framework.renderers import JSONRenderer # json格式的渲染
from rest_framework.renderers import BrowsableAPIRenderer # 浏览器格式的渲染
# JSONParser: json数据
# FormParser: urlencoded
# MultiPartParser:form-data
class Book(APIView):
renderer_classes = [JSONRenderer,]### json格式的渲染
def get(self, request, *args, **kwargs):
return Response('get ok')
renderer_classes = [BrowsableAPIRenderer,]###浏览器渲染
renderer_classes = [BrowsableAPIRenderer,JSONRenderer]
#俩个都有 会选择第一个
renderer_classes = []#如果为空 的话就无法请求
全局配置
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': [
'rest_framework.renderers.JSONRenderer',
# 'rest_framework.renderers.BrowsableAPIRenderer',
],
}
开发一般只会配置JSONRenderer,防止破解
有全局和局部都配置的情况下,优先走局部配置
渲染模块源码分析
- 二次处理响应对象:APIView的dispatch方法 - self.finalize_response(request, response, *args, **kwargs)
- 获取渲染类对象:进入finalize_response方法 - self.perform_content_negotiation(request, force=True)
- 从配置文件中得到渲染类对象:perform_content_negotiation -> self.get_renderers() -> [renderer() for renderer in self.renderer_classes]
核心:可以全局和局部配置视图类支持的结果渲染:默认可以json和页面渲染,学习该模块的目的是开发可以全局只配置json方式渲染
入口:dispatch()方法
# 二次处理,渲染模块
self.response = self.finalize_response(request, response, *args, **kwargs)
if isinstance(response, Response):
if not getattr(request, 'accepted_renderer', None):
# 内部解析了配置的渲染类
neg = self.perform_content_negotiation(request, force=True)
# 解压赋值
request.accepted_renderer, request.accepted_media_type = neg
def perform_content_negotiation(self, request, force=False):
"""
Determine which renderer and media type to use render the response.
"""
# 获取渲染的方式
renderers = self.get_renderers()
conneg = self.get_content_negotiator()
try:
return conneg.select_renderer(request, renderers, self.format_kwarg)
except Exception:
if force:
# 获取第一个渲染方式
return (renderers[0], renderers[0].media_type)
raise
def get_renderers(self):
"""
Instantiates and returns the list of renderers that this view can use.
"""
# 找rederers_classes方法
return [renderer() for renderer in self.renderer_classes]
class APIView(View):
# The following policies may be set at either globally, or per-view.
renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES
首先找自己的配置,自己没有找局部配置,然后找全局配置,最后找django配置的