渲染模块、解析模块、响应模块、封装响应模块
渲染模块、解析模块、响应模块、封装响应模块
一 渲染模块使用
作用:
基本没啥卵用,无非就可以屏蔽掉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)