Django中Middleware中间件
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.
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Mysql 常用(学习笔记二十二)
开启:./mysqld_safe --default-file=/etc/my.cnf --user=mysql 检查端口: netstat -tnlup|grep 3306 lsof -i:3306 为MySQL设置密码或者修改密码:mysqladmin -u root password “newpass” 如果root已经设置过密码,采用如下方法 mysqladmin -u root password oldpass “newpass” mysqladmin -u root password "xx" 登陆MySQL数据库:mysql -h -P -u -p xx show variables like '%character_set%' select version(); select user(); create database oldboy character set gbk; grant all on *.* to oldboy@'%' identified by '12356'; flush privileges; show grants for oldboy@'loc...
- 下一篇
重新定义数据库的时刻,阿里云数据库专家带你了解POLARDB
摘要:POLARDB是阿里云ApsaraDB数据库团队研发的基于云计算架构的下一代关系型数据库,其最大的特色是计算节点与存储节点分离,借助优秀的RDMA网络以及最新的块存储技术。POLARDB不但满足了公有云计算环境下用户业务快速弹性扩展的刚性需求,同时也满足了互联网环境下用户对数据库服务器高可用的需求。本文就带领大家了解什么是“云原生数据库”,云原生数据库的标准是什么,如何定义以及为何如此定义?为大家介绍下一代云原生数据库POLARDB的架构、产品设计、未来工作等内容。 以下内容根据演讲嘉宾视频分享以及PPT整理而成,PPT下载链接。 数十款阿里云产品限时折扣中,赶紧点击这里,领劵开始云上实践吧! 演讲嘉宾简介:蔡松露(子嘉),阿里云云数据库总架构师,主要负责阿里云POLARDB、NoSQL技术以及阿里云数据库整体架构等工作。在搜索引擎、NoSQL数据库、分布式系统、操作系统内核等领域有深厚积累与丰富的经验。 本文主要内容有: 一、什么是云原生数据库 二、云原生数据库POLARDB架构实现 三、云原生数据库POLARDB产品设计 一、什么是云原生数据库 POLARDB是一个云原生数据...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- 设置Eclipse缩进为4个空格,增强代码规范
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS8安装Docker,最新的服务器搭配容器使用
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题