zoukankan      html  css  js  c++  java
  • 利用自定义中间件来实现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的响应格式:

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

    响应头部一堆键值对,

    响应体

  • 相关阅读:
    【Python五篇慢慢弹(3)】函数修行知python
    【Python五篇慢慢弹】数据结构看python
    【项目管理】GitHub使用操作指南
    【Python五篇慢慢弹】快速上手学python
    【NLP】十分钟快览自然语言处理学习总结
    【NLP】条件随机场知识扩展延伸(五)
    【NLP】基于统计学习方法角度谈谈CRF(四)
    【NLP】基于机器学习角度谈谈CRF(三)
    【NLP】基于自然语言处理角度谈谈CRF(二)
    【NLP】前戏:一起走进条件随机场(一)
  • 原文地址:https://www.cnblogs.com/surpass123/p/13224219.html
Copyright © 2011-2022 走看看