开发者社区> 蓝色の流星VIP> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Django中Middleware中间件

简介: 1 Middleware中间件概述 django中间middleware实质就是一个类,django会根据自己的规则在合适的时机执行中 提前处理,此时中间件就上场了。
+关注继续查看

1 Middleware中间件概述

    django中间middleware实质就是一个类,django会根据自己的规则在合适的时机执行中
提前处理,此时中间件就上场了。

django在settings模块中,有一个MIDDLEWARE_CLASSES变量,其中每一个元素就是一个中间件。
在settings.py文件中:
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.DataConvert''自定义中间件添加位置'
]

常见的middleware组件:
1. Sessions     
2. Authentication   
3. CSRF Protection 
4. GZipping Content

2 Middleware处理功能

在Djano中,中间件承担作用   Resquest---->Middleware ---->View----->Response
比如如果想实现接入安全验证,middleware是比较好的选择,是连接request与view的桥梁
Django中支持的中间件可以实现如下方法:

    方法名称            执行周期
    process_request     接受到request之后,但在确定View之前
    process_view        确定view之后,但真正执行view之前
    process_response    执行view之后
    process_exception   view抛出异常之后

详解: 每个请求都是先通过中间件process_request函数,这个函数返回None或者
HttpResponse对象,返回前者继续处理其他中间件,返回HttpResponse,处理终止返回网页内
.每个中间件都是按照顺序依次进入处理程序.

3 自定义中间件Middleware


    我们网站放在服务器正式运行之后,DEBUG改为False,这样更加安全,但有时候发生错误不能
显示错误详情页面,普通用户看到的是友好的报错信息,管理员看到的是错误详情,以便于修复
BUG,为达到两者效果,利用middleware就能做到.下面我们看下我们定义的Middleware:
import sys
from django.views.debug import technical_500_response
from django.conf import settings

class UserBasedExceptionMiddleware(object):
   def process_exception(self, request, exception):
       if request.user.is_superuser or request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS:
           return technical_500_response(request, *sys.exc_info())

    在给大家展示一个有用的例子,我们都知道浏览器发送数据仅支持GET和POST两种请求方式,
那我们是怎么实现PUT,DELETE,OPTIONS请求的功能的呢?  
下面我们将展示采用中间件将request中的请求信息进行转化的方法:

PUT/DELETE/OPTIONS方法的转换中间件:

import json
from django.utils.deprecation import MiddlewareMixin
from django.http.multipartparser import MultiPartParser

class MethodConvertMiddleware(MiddlewareMixin):
    #创建请求处理函数
    def process_request(self,request):
        method = request.method
        #判断请求请求头信息中content-type是否含有application/json

        if 'application/json' in request.META['CONTENT_TYPE']:
            #json格式转Python字典
            data = json.loads(request.body.decode()
        #判断请求请求头信息中content-type是否含有mutipart/form-data

        elif 'mutipart/form-data' in request.META['CONTENT_TYPE']:
            #解析器解析出data与文件
            data,files = MultiPartParser(request.META,request,request.upload_handlers).parse()
        else:
            #这里不支持application/x-www-form-urlencoded,其余返回{}
            data = {}
            files = None
        #前段讲请求方式放在HTTP_X_METHOD
        if 'HTTP_X_METHOD' in request.META:
            method = request.META['HTTP_X_METHOD'].upper()
            #例如设定method = 'PUT'
            setattr(request,'method',method)
        if files:
            #files存在 request.PUT_FILES = files  数据data也设置给PUT,这样就转换过来了
            setattr(request,'{method}_FILES'.format(method=method),files)
        setattr(request,method,data)
        #中间件进入下一个处理程序
        return None
注:1  中间件没有添加异常处理程序,可自行添加.
   2  中间件只针对两种常见数据类型格式application/json 与 application/form-data.

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Django中间件Middleware简单使用
Django中间件Middleware简单使用
0 0
Python爬虫:Scrapy中间件Middleware和Pipeline
Python爬虫:Scrapy中间件Middleware和Pipeline
0 0
通过thinkjs的middleware将less作为中间件进行处理
最近在折腾的时候又想写less了,但是换框架了,成了thinkjs,考虑到开发阶段一直编译编译less的情况..最终根据middleware的特点实现了一个超级简单的less中间件。
0 0
FastAPI(37)- Middleware 中间件
FastAPI(37)- Middleware 中间件
0 0
如何查找SAP CRM通过中间件Middleware连接的远端ERP系统
如何查找SAP CRM通过中间件Middleware连接的远端ERP系统
0 0
利用CRM中间件Middleware从ERP下载Customer Material的常见错误
使用事务码VD51和VD52创建和修改Customer Material。 下图是我在ERP创建的Material,为其维护了一个Customer Material AOP。
0 0
ASP.NET Core 入门教程 9、ASP.NET Core 中间件(Middleware)入门
ASP.NET Core 入门教程 9、ASP.NET Core 中间件(Middleware)入门一、前言1、本教程主要内容ASP.NET Core 中间件介绍通过自定义 ASP.NET Core 中间件实现请求验签2、本教程环境信息软件/环境 说明操作系统 Windows 10SDK 2.
1486 0
利用CRM中间件Middleware从ERP下载Customer Material的常见错误
使用事务码VD51和VD52创建和修改Customer Material。下图是我在ERP创建的Material,为其维护了一个Customer Material AOP。 当下载到CRM后,在WebClient UI上显示如下: 下载Customer Material的主要配置: 通过表KNMT.
1985 0
阿里云中间件首席架构师李小平:企业为什么需要云原生?
阿里云希望跟社会各界的朋友一起在云原生领域里面做更多的探索,希望通过云原生技术,真正为企业带来更多的业务价值,助力企业整体的业务创新。
0 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
阿里云中间件开发者大会主论坛演讲合集
立即下载
阿里云中间件开发者大会|分布式应用架构专场演讲合集
立即下载
阿里云中间件开发者大会|分布式应用治理专场演讲合集
立即下载