渲染模块、解析模块、响应模块、封装响应模块

渲染模块、解析模块、响应模块、封装响应模块

一 渲染模块使用

作用:

基本没啥卵用,无非就可以屏蔽掉django给浏览器返回规整的模板,又或者那drf返回模板。那不用drf得了呗。

局部配置

from rest_framework.views import APIView
from rest_framework.response import Response

from rest_framework.renderers import JSONRenderer
from rest_framework.renderers import BrowsableAPIRenderer
class UserAPIView(APIView):
    # 局部配置:只有该视图类起作用
    renderer_classes = [JSONRenderer]  # 只提供JSON数据渲染
    pass

全局配置

# drf配置
REST_FRAMEWORK = {
    # 响应的渲染模块
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
    ],
}

二 请求数据解析模块:

作用:

规定可以解析前台传过来的数据类型,都最后都统一解析到request.data里。

默认支持解析前台传来json、form-data、urlencoding这三种类型

源码浅析

# 入口:APIView类的dispatch函数
request = self.initialize_request(request, *args, **kwargs)
->
parsers=self.get_parsers()
->
self.parser_classes
->
APISetting:DEFAULT_PARSER_CLASSES

局部配置

from rest_framework.views import APIView
from rest_framework.response import Response

from rest_framework.parsers import JSONParser
from rest_framework.parsers import FormParser
from rest_framework.parsers import MultiPartParser
class UserAPIView(APIView):
    # 局部配置:只有该视图类起作用
    parser_classes = [JSONParser]  # 只提供JSON解析
    pass

全局配置

# drf配置
REST_FRAMEWORK = {
    # 响应的渲染模块
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
    ],
    # 请求数据解析模块
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',  # 'application/json'
        'rest_framework.parsers.FormParser',  # 'application/x-www-form-urlencoded'
        'rest_framework.parsers.MultiPartParser'  # multipart/form-data
    ],
}

请求数据解析位置

# 请求的数据包:均解析到 request.data 中
# 请求的?文件参数:均解析到 request.query_params 中

三 响应模块

# 响应可以设置响应数据、响应网络状态码、响应头、响应数据类型等
data = {
    'status': 0,
    'msg': 'get ok',
    'results': [],
    'token': '123.12321.231'
}
from rest_framework import status
class ..
    def ..
        return Response(
            data=data,
            status=status.HTTP_200_OK,
            headers={'Token': '123as.masd21.asd213sd'},# 规定响应头里面的内容
            content_type='application/json'  # 强制让所有的请求返回时候是 json格式了,最好不要这么做,如果返回的格式是 text/html 就会出问题。
      )

四 封装响应模块

views.py

from rest_framework.response import Response
from rest_framework.views import APIView
from my_utils.response import APIResponse
class UserView(APIView):
    # 局部配置:只有该视图类起作用
    # 也就是只能返回Json的格式,不会对浏览器做额外处理
    # renderer_classes = [JSONRenderer]
    def get(self,request,*args,**kwargs):
        """
        # 封装前
        Response({
            'status': 0,
            'msg': 'ok',
            'results': [],
            'token': ''
        }, headers={}, status=200, content_type="")

        # 封装后
        APIResponse(0, 'ok', results, status, headers, content_type)
        """
        return APIResponse('1','ok',['123123','123'],token='123,123,123')

my_utils/response.py

from rest_framework.response import Response
# from rest_framework import status
"""
# 封装前
Response({
    'status': 0,
    'msg': 'ok',
    'results': [],
    'token': ''
}, headers={}, status=200, content_type="")

# 封装后
APIResponse(0, 'ok', results, status, headers, content_type)
"""
class APIResponse(Response):
    def __init__(self,data_status,data_msg,results='',status=None,headers=None,content_type=None,**kwargs):
        data ={
            'status':data_status,
            'msg':data_msg
        }
        if results:
            data['results'] = results

        data.update(kwargs)
        super().__init__(data=data,status=status,headers=headers,content_type=content_type)
posted @ 2019-11-06 14:37  张明岩  阅读(356)  评论(0编辑  收藏  举报