Django中Middleware中间件
Django中Middleware中间件
1 Middleware中间件概述
django中间middleware实质就是一个类,django会根据自己的规则在合适的时机执行中间件相应的方法。实际上当我们想在发起请求到服务器views处理函数,我们想对请求做一些提前处理,此时中间件就上场了。
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)
中间件: 在研究中间件的时候我们首先要知道 1 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Djang ...
- Django 中CSRF中间件 'django.middleware.csrf.CsrfViewMiddleware',
1.Django中CSRF中间件的工作原理及form表单提交需要添加{% csrf_token %}防止出现403错误 CSRF # 表示django全局发送post请求均需要字符串验证功能:防止跨站 ...
- Django 中的中间件
Django 中的中间件 Django 中间件 中间件介绍 前戏 之前在判断登录的时候使用的是装饰器的功能,通过给视图函数加装饰器来增加判断是否登录的功能.但此方法的缺点是必须给每个需要判断登录的视 ...
- [Django高级]理解django中的中间件机制和执行顺序
原文来自 Understanding Django Middlewares, 这篇文章从整体上介绍了django中中间件定义,作用,和怎么样自己写中间件 –orangleliu. 注:middlewa ...
- django中的中间件
中间件介绍 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出.每个中间件组件都负责 ...
- django中的中间件机制和执行顺序
这片文章将讨论下面内容: 1.什么是middleware 2.什么时候使用middleware 3.我们写middleware必须要记住的东西 4.写一些middlewares来理解中间件的工作过程和 ...
- Django之Middleware中间件方法使用
自定义中间件五个方法(部分方法)实例 自定义中间件项目: 模板Templates login.html {% load static %} <!DOCTYPE html> <html ...
- 基于django中settings中间件源码思想,实现功能的插拔式设计
这里我们用到一个非常重要的模块,importlib,利用它可以实现字符串转python代码,再利用反射进行操作,这样就可以实现插拔式设计. 一.我们先做个初级的,把所有文件放到初级思想文件夹下: 1. ...
- RBAC在Django中基于中间件的AJAX应用案例
项目文件: models.py from django.db import models from django.contrib.auth.models import AbstractUser # ...
随机推荐
- Spring的事务 之 9.1 数据库事务概述 ——跟我学spring3
9.1 数据库事务概述 事务首先是一系列操作组成的工作单元,该工作单元内的操作是不可分割的,即要么所有操作都做,要么所有操作都不做,这就是事务. 事务必需满足ACID(原子性.一致性.隔离性和持久性 ...
- oracle to_date 函数
update pamsodt0p10 set cursysdate = to_date('2014-12-29 00:00:00','yyyy-mm-dd hh24:mi:ss') where cu ...
- 有关Java 锁原理
锁 锁是用来锁东西的,让别人打不开也看不到!在线程中,用这个“锁”隐喻来说明一个线程在“操作”一个目标(如一个变量)的时候,如果变量是被锁住的,那么其他线程就对这个目标既“操作”不了(挂起)也无法看到 ...
- Java核心卷笔记(一)
第三章Java基程序设计结构 1.注释 三种注释方式: // 注释单行 /* 内容 */ 注释单行 /** * 内容 */ 2. java 数据类型 Java数据类型可分为两种:基本数据类型和引用数据 ...
- 微信小程序开发问题汇总
前言 经过将近一个多月的开发,我们团队开发的微信小程序 "出发吧一起" 终于开发完成,现在的线上版本为 2.2.4-beta 版 本文档主要介绍该小程序在开发中所用到的技术,已经在 ...
- .NET开发微信小程序-上传图片到服务器
1.上传图片分为几种: a:上传图片到本地(永久保存) b:上传图片到本地(临时保存) c:上传图片到服务器 a和b在小程序的api文档里面有.直接说C:上传图片到服务器 前端代码: /* 上传图片到 ...
- RedisTemplate执行Redis脚本
对于Redis脚本使用过的同学都知道,这个主要是为了防止竞态条件而用的.因为脚本是顺序执行的.(不用担心效率问题)比如我在工作用,用来设置考试最高分. 如果还没有用过的话,先去看Redis脚本的介绍, ...
- socket和webService的区别
网络七层协议为:物理层.数据链路层.网络层.传输层.会话层.表示层.应用层 socket 只是 java在网络层定义的类,用来实现网络层.上面的各层需要我们自己在程序里实现. 例如端口可以自己定义 . ...
- 由于github仓库中提前建立readme文件,导致git push报错error: failed to push some refs to 'git@github.com:
$ git push -u origin master To git@github.com:xxx/xxx.git ! [rejected] master -> master (fetch fi ...
- linux几种定时函数的使用
Linux定时函数介绍: 在程序开发过程中,我们时不时要用到一些定时器,通常如果时间精度要求不高,可以使用sleep,uslepp函数让进程睡眠一段时间来实现定时, 前者单位为秒(s),后者为微妙(u ...