Response类生成对象须要的参数,以及Response类的对象可使用的属性
一、参数:Response(data=响应的数据, status=响应的网络状态码, headers=想经过响应头再携带部分信息给前端)
二、属性:response.data response.status_code response.status_texthtml
核心:知道response对象产生能够传那些信息,response对象又是如何访问这些信息的前端
""" 返回数据类型 response = { 'status': 7, 'exc': '异常信息' } """ from rest_framework.response import Response from rest_framework.views import exception_handler as drf_exception_handler from rest_framework import status def exception_handler(exc, context): response = drf_exception_handler(exc, context) if response is None: # drf没有处理的异常(服务器异常) return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR, data={ 'status': 7, 'exc': '%s' % exc }) #设置状态码 # 项目阶段,要记录到日志文件 return Response(status=response.status_code, data={ 'status': 7, # drf处理的客户端异常,原始处理方式是将异常信息放在response对象的data中,data的格式是{'datail': '具体的异常信息'} 'exc': '%s' % response.data.get('detail') })
根据 用户请求URL 或 用户可接受的类型,筛选出合适的 渲染组件。
用户请求URL:
http://127.0.0.1:8000/test/?format=json
http://127.0.0.1:8000/test.jsonpython
显示json格式:JSONRendererjson
访问URL:api
默认显示格式:BrowsableAPIRenderer(能够修改它的html文件)服务器
访问URL:网络
表格方式:AdminRenderer源码分析
访问URL:rest
form表单方式:HTMLFormRenderer日志
访问URL:
from rest_framework.renderers import HTMLFormRenderer,BrowsableAPIRenderer class BookDetailView(APIView): renderer_classes = [HTMLFormRenderer,BrowsableAPIRenderer ] def get(self,request,pk): book_obj=models.Book.objects.filter(pk=pk).first() bs=BookSerializers(book_obj,many=False) return Response(bs.data) def put(self,request,pk): book_obj = models.Book.objects.filter(pk=pk).first() bs=BookSerializers(data=request.data,instance=book_obj) if bs.is_valid(): bs.save() # update return Response(bs.data) else: return Response(bs.errors) def delete(self,request,pk): models.Book.objects.filter(pk=pk).delete() return Response("")
REST_FRAMEWORK = { 'DEFAULT_RENDERER_CLASSES': ['rest_framework.renderers.JSONRenderer'] }
from rest_framework.renderers import TemplateHTMLRenderer class BookDetailView(APIView): renderer_classes = [TemplateHTMLRenderer] def get(self,request,pk): book_obj=models.Book.objects.filter(pk=pk).first() bs=BookSerializers(book_obj,many=False) return Response(bs.data,template_name='aa.html') <!DOCTYPE html> <html lang="en"> <head> <title>Title</title> </head> <body> {{ title }} {{ publishDate }} </body> </html>
Response类的__init__方法
class Response(SimpleTemplateResponse): """ An HttpResponse that allows its data to be rendered into arbitrary media types. """ def __init__(self, data=None, status=None, template_name=None, headers=None, exception=False, content_type=None): """ Alters the init arguments slightly. For example, drop 'template_name', and instead use 'data'. Setting 'renderer' and 'media_type' will typically be deferred, For example being set automatically by the `APIView`. """ super().__init__(None, status=status) if isinstance(data, Serializer): msg = ( 'You passed a Serializer instance as data, but ' 'probably meant to pass serialized `.data` or ' '`.error`. representation.' ) raise AssertionError(msg) self.data = data self.template_name = template_name self.exception = exception self.content_type = content_type if headers: for name, value in headers.items(): self[name] = value
返回信息
格式:
{ 'status':0, 'msg':"", 'results':'', ... }
from rest_framework.response import Response class APIResponse(Response): # 格式化data def __init__(self, status=0, msg='ok', results=None, http_status=None, headers=None, exception=False, **kwargs): data = { # json的response基础有数据状态码和数据状态信息 'status': status, 'msg': msg } if results is not None: # 后台有数据,响应数据 data['results'] = results data.update(**kwargs) # 后台的一切自定义响应数据直接放到响应数据data中 super().__init__(data=data, status=http_status, headers=headers, exception=exception)