中间件

中间件是在request和response处理过程中的一个插件。比如在request到达视图函数之前,我们可以使用中间件来做一些相关的事情,比如可以判断当前这个用户有没有登录,如果登录了,就绑定一个user对象到request上。也可以在response到达浏览器之前,做一些相关的处理,比如想要统一在response上设置一些cookie信息等。

自定义中间件:
中间件所处的位置没有规定。只要是放到项目当中即可。一般分为两种情况,如果中间件是属于某个app的,那么可以在这个app下面创建一个python文件用来存放这个中间件,也可以专门创建一个Python包,用来存放本项目的所有中间件。创建中间件有两种方式,一种是使用函数,一种是使用类,接下来对这两种方式做个介绍:

使用函数的中间件:

def simple_middleware(get_response):
# 这个中间件初始化的代码

  def middleware(request):# request到达view的执行代码response = get_response(request)# response到达浏览器的执行代码return responsereturn middleware

使用类的中间件:

class SimpleMiddleware(object):
def init(self, get_response):
self.get_response = get_response
# 这个中间件初始化的代码
def call(self, request):
# request到达view之前执行的代码

          response = self.get_response(request)# response到达用户浏览器之前执行的代码return response

在写完中间件后,还需要在settings.MIDDLEWARES中配置写好的中间件才可以使用。比如我们写了一个在request到达视图函数之前,判断这个用户是否登录,如果已经登录就绑定一个user对象到request上的中间件,这个中间件放在当前项目的middlewares.users下:

def user_middleware(get_response):
# 这个中间件初始化的代码

  def middleware(request):# request到达view的执行代码userid = request.session.get("userid")userModel = FrontUser.objects.filter(pk=userid).first()if userModel:setattr(request,'frontuser',userModel)response = get_response(request)# response到达浏览器的执行代码return responsereturn middleware

那么就可以在settings.MIDDLEWARES下做以下配置:

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’,
‘middlewares.users.user_middleware’
]
中间件的执行是有顺序的,他会根据在MIDDLEWARE中存放的顺序来执行。因此如果有些中间件是需要基于其他中间件的,那么就需要放在其他中间件的后面来执行。

Django内置的中间件:

django.middleware.common.CommonMiddleware:通用中间件。他的作用如下:
限制settings.DISALLOWED_USER_AGENTS中指定的请求头来访问本网站。DISALLOWED_USER_AGENT是一个正则表达式的列表。示例代码如下:
import re
DISALLOWED_USER_AGENTS = [
re.compile(r’^\sKaTeX parse error: Expected group after '^' at position 2: |^̲’),
re.compile(r’.PhantomJS.’)
]
如果开发者在定义url的时候,最后有一个斜杠。但是用户在访问url的时候没有提交这个斜杠,那么CommonMiddleware会自动的重定向到加了斜杠的url上去。
django.middleware.gzip.GZipMiddleware:将响应数据进行压缩。如果内容长度少于200个长度,那么就不会压缩。
django.contrib.messages.middleware.MessageMiddleware:消息处理相关的中间件。
django.middleware.security.SecurityMiddleware:做了一些安全处理的中间件。比如设置XSS防御的请求头,比如做了http协议转https协议的工作等。
django.contrib.sessions.middleware.SessionMiddleware:session中间件。会给request添加一个处理好的session对象。
django.contrib.auth.middleware.AuthenticationMiddleware:会给request添加一个user对象的中间件。
django.middleware.csrf.CsrfViewMiddleware:CSRF保护的中间件。
django.middleware.clickjacking.XFrameOptionsMiddleware:做了clickjacking攻击的保护。clickjacking保护是攻击者在自己的病毒网站上,写一个诱惑用户点击的按钮,然后使用iframe的方式将受攻击的网站(比如银行网站)加载到自己的网站上去,并将其设置为透明的,用户就看不到,然后再把受攻击的网站(比如银行网站)的转账按钮定位到病毒网站的按钮上,这样用户在点击病毒网站上按钮的时候,实际上点击的是受攻击的网站(比如银行网站)上的按钮,从而实现了在不知不觉中给攻击者转账的功能。
缓存中间件:用来缓存一些页面的。
django.middleware.cache.UpdateCacheMiddleware。
django.middleware.cache.FetchFromCacheMiddleware。
内置中间件放置的顺序:
SecurityMiddleware:应该放到最前面。因为这个中间件并不需要依赖任何其他的中间件。如果你的网站同时支持http协议和https协议,并且你想让用户在使用http协议的时候重定向到https协议,那么就没有必要让他执行下面一大串中间件再重定向,这样效率更高。
UpdateCacheMiddleware:应该在SessionMiddleware, GZipMiddleware, LocaleMiddleware之前。
GZipMiddleware。
ConditionalGetMiddleware。
SessionMiddleware。
LocaleMiddleware。
CommonMiddleware。
CsrfViewMiddleware。
AuthenticationMiddleware。
MessageMiddleware。
FetchFromCacheMiddleware。
FlatpageFallbackMiddleware。
RedirectFallbackMiddleware。

2018.11.05._PYTHN_DJANGO_CLASS 144~CLASS147相关推荐

  1. 2018.11.05 NOIP模拟 规避(最短路计数)

    传送门 正难则反. 考虑计算两人相遇的方案数. 先正反跑一遍最短路计数. 然后对于一条在最短路上的边(u,v)(u,v)(u,v),如果(dis(s,u)*2<total&&di ...

  2. QIIME 2用户文档. 7差异丰度分析gneiss(2018.11)

    文章目录 前情提要 QIIME 2用户文档. 7差异丰度分析gneiss 创建`balances` 选项1:相关性聚类 选项2:梯度聚类 用平衡建立线性模型 Reference 译者简介 猜你喜欢 写 ...

  3. Java第十二天~第十三天/11.04~11.05

    第十二天/11.04 一.选择排序 从0索引开始,用它对应的元素依次和后面索引对应的元素进行比较,小的往前放,第一次比较完毕后,最小值出现在最小索引处,依次比较,就可以得到一个排好序的数组. pack ...

  4. QIIME 2用户文档. 18使用q2-vsearch聚类OTUs(2018.11)

    文章目录 前情提要 使用`q2-vsearch`聚类序列为OTUs 下载数据 序列去冗余 特征[频率]和特征数据[序列]的聚类 无参聚类 有参聚类 半有参聚类 Reference 译者简介 猜你喜欢 ...

  5. QIIME 2用户文档. 17序列双端合并read-joining(2018.11)

    文章目录 前情提要 序列双端合并的另一种方法`read-joining` 数据下载 序列合并 查看合并序列的数据质量和摘要 序列质控 Deblur 查看Deblur特征表 导入双端合并的序列 导入序列 ...

  6. QIIME 2用户文档. 16鉴定和过滤嵌合体序列q2-vsearch(2018.11)

    文章目录 前情提要 鉴定和过滤嵌合体序列`q2-vsearch` 数据下载 无参嵌合体鉴定 可视化统计结果 过滤特征表和序列 过滤嵌合体和可疑序列 过滤嵌合但保留可疑序列 Reference 译者简介 ...

  7. QIIME 2用户文档. 15进行纵向和成对样本比较q2-longitudinal(2018.11)

    文章目录 前情提要 进行纵向和成对样本比较`q2-longitudinal` 成对差异比较 线性混合效应模型 波动性分析 跟踪变化率的第一个差异 从静态时间点跟踪变化率 非参数微生物相关性试验(NMI ...

  8. QIIME 2用户文档. 14机器学习预测样品元数据分类和回归q2-sample-classifier(2018.11)

    文章目录 前情提要 预测样本元数据`q2-sample-classifier` 预测样本分类 预测样本连续型元数据 嵌套交叉验证为所有样本提供预测 最佳实践:不应该使用`q2-sample-class ...

  9. QIIME 2用户文档. 13数据评估和质控Evaluating and controlling(2018.11)

    文章目录 前情提要 数据评估和质控`q2-quality-control` 下载数据 基于比对过滤序列 质量评估已知组成的样品 评估序列质量 Reference 译者简介 猜你喜欢 写在后面 前情提要 ...

  10. QIIME 2用户文档. 12训练特征分类器Training feature classifiers(2018.11)

    文章目录 前情提要 训练特征分类器 下载并导入参考序列 提取参考序列 训练分类集 测试分类集 分类真菌ITS序列 Reference 译者简介 猜你喜欢 写在后面 前情提要 QIIME 2可重复.交互 ...

最新文章

  1. java通过抛异常来返回提示信息
  2. WinCE的C#编程,对float型进行四舍五入保留两位小数,小数进行四舍五入操作,Math.Round的应用案例。...
  3. python import_Python中import机制
  4. even though storm
  5. 如何安装指定版本的 SAP Spartacus
  6. 最优化学习笔记(十五)——拟牛顿法(1)
  7. 在Blazor中构建数据库应用程序——第6部分——向天气应用程序添加新记录类型及其UI
  8. sqlalchemy create engine
  9. springboot连接redis错误 io.lettuce.core.RedisCommandTimeoutException:
  10. JavaScript DOM(一)
  11. 哈希表中处理冲突的方法
  12. mysql外键英文_MySQL开发中的外键(foreign key)与参照完整性(Referential integrity) [中英文转载]...
  13. cuda cudnn 下载地址
  14. 网站被移动运营方屏蔽怎么办?
  15. REST Assured 1 - REST Assured 介绍
  16. 彻底禁用win10自动更新功能及其powershell代码
  17. Android APP OpenGL ES应用(01)GLSurfaceView 2D/3D绘图基础
  18. 数据结构NO5--栈和队列简要
  19. 推荐几个编程学习网站
  20. html hr代码的效果,HTML hr是什么意思

热门文章

  1. 机器学习(2)——监督学习
  2. 多目标进化算法(MOEA)概述
  3. Coverity 2018,Coverity2019使用教程
  4. 用透明屏+pH电极做一个pH计
  5. 天池大数据竞赛——糖尿病遗传风险预测赛后总结(二)
  6. LCD和LED屏幕的工作原理总结
  7. unity3d利用pano2VR实现全景视图效果
  8. 20款电脑码字软件,网络作家实用软件珍藏,首推橙瓜码字
  9. java drag_[Java教程]一步一步理解拖拽Drag(四)
  10. Spark大数据平台