利用自定义中间件来实现DRF框架中的request对象的data属性

自定义中间件来实现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的响应格式:

状态行:包括 协议版本,状态码,状态码描述 ,

响应头部一堆键值对,

响应体

原文地址:https://www.cnblogs.com/surpass123/p/13224219.html