自定义中间件来实现DRF框架中的request对象的data属性
知识点
django中提交post请求的两种方式:
(1) form表单提交;
(2) ajax请求提交数据。
form表单提交数据的编码格式
:(1)urlencoded;(2)form-data
ajax提交数据的编码格式
:(1)urlencoded;(2)form-data;(3)json格式
我们知道:
django会将urlencoded格式的数据封装到request.POST中,将form-data格式的数据封装到request.FILES中,而json数据
比较特殊,django不会对其做任何处理,会将其封装到request.body
, 需要我们自己对其进行反序列化处理。
django的drf框架对 各种编码格式的数据进行统一封装,存储到request.data
中。
from django.utils.deprecation import MiddlewareMixin
import json
class RetDict(MiddilewareMixin):
"""返回字典数据"""
def process_request(self,request):
self.data = {}
if request.method == 'GET':
self.data.update(request.GET)
elif request.method == 'POST':
if request.META['CONTENT_TYPE'].split(':')[0] == 'application/json'
self.data.update(json.loads(request.body))
else:
if request.FILES:
self.data.update(request.FILES)
if request.GET:
self.data.update(request.GET)
self.data.update(request.POST)
request.data = self.data
补充另外一种方法:
# 使用异常捕获的方法
import json
from django.utils.deprecation import MiddlewareMixin
class JsonMiddel(MiddlewareMixin):
def process_request(self, request):
try:
request.data=json.loads(request.body)
except Exception as e:
request.data=request.POST
中间件CommonMiddleware实现了'/'重定向
'django.middleware.common.CommonMiddleware'
def should_redirect_with_slash(self, request):
"""
Return True if settings.APPEND_SLASH is True and appending a slash to
the request path turns an invalid path into a valid one.
"""
if settings.APPEND_SLASH and not request.path_info.endswith('/'):
urlconf = getattr(request, 'urlconf', None)
return (
not is_valid_path(request.path_info, urlconf) and
is_valid_path('%s/' % request.path_info, urlconf)
)
return False
配置文件settings.py文件中的APPEND_SLASH的通常为True
当APPEND_SLASH的值为True并且url不是以'/'结尾,它就会尝试去重定向
http协议的四大特性:
(1)基于请求和响应(request,response);
(2)基于TCP/IP并作用于应用层之上的协议;
(3)无连接;
(4)无状态;
HTTP的请求格式:
请求首行:包括 请求方法(GET,POST)
,请求URL
,协议版本
,
请求头部:一堆键值对
,
请求体
HTTP的响应格式:
状态行:包括 协议版本
,状态码
,状态码描述
,
响应头部:一堆键值对
,
响应体