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)