deffinalize_response(self,request,response,*args,**kwargs):"""
Returns the final response object.
"""# 断言是否是HttpResponseBase对象# Make the error obvious if a proper response is not returnedassertisinstance(response,HttpResponseBase),('Expected a `Response`, `HttpResponse` or `HttpStreamingResponse` ''to be returned from the view, but received a `%s`'%type(response))# 判断是否是Response对象ifisinstance(response,Response):ifnotgetattr(request,'accepted_renderer',None):neg=self.perform_content_negotiation(request,force=True)request.accepted_renderer,request.accepted_media_type=negresponse.accepted_renderer=request.accepted_rendererresponse.accepted_media_type=request.accepted_media_typeresponse.renderer_context=self.get_renderer_context()# Add new vary headers to the response instead of overwriting.vary_headers=self.headers.pop('Vary',None)ifvary_headersisnotNone:patch_vary_headers(response,cc_delim_re.split(vary_headers))forkey,valueinself.headers.items():response[key]=valuereturnresponse
defperform_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:returnconneg.select_renderer(request,renderers,self.format_kwarg)exceptException:ifforce:return(renderers[0],renderers[0].media_type)raise
代码中有个get_renderers就是渲染器列表,点击查看
Python
1
2
3
4
5
defget_renderers(self):"""
Instantiates and returns the list of renderers that this view can use.
"""return[renderer()forrendererinself.renderer_classes]
DEFAULTS={# Base API policies'DEFAULT_RENDERER_CLASSES':['rest_framework.renderers.JSONRenderer','rest_framework.renderers.BrowsableAPIRenderer',],'DEFAULT_PARSER_CLASSES':['rest_framework.parsers.JSONParser','rest_framework.parsers.FormParser','rest_framework.parsers.MultiPartParser'],}