響應模塊Response

響應模塊Response

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("")

全局使用

settings.py中配置

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

響應模塊格式化response(二次封裝)

返回信息

格式:

{
    '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)
相關文章
相關標籤/搜索