Django中间件详解

中间件位置

WSGI

主要负责的就是负责和浏览器和应用之家沟通的桥梁

浏览器发送过来一个http请求,WSGI负责解包,并封装成能够给APP使用的environ,当app数据返回时,再把app的数据打包成一个http响应

想了解更详细的:https://www.cnblogs.com/zzzlw/p/9747872.html

中间件的五个方法

预处理函数

process_request(self, request)

如果返回None,Django将继续处理这个request,执行后续的中间件, 然后调用相应的 view。

如果返回HttpResponse对象,Django将不再执行任何除了process_response以外其它的中间件以及相应的view,Django将立即返回该HttpResponse。

预处理函数

process_view(self, request, view_func, view_args, view_kwargs)

如果返回 HttpResponse 对象,Django 将不再执行任何其它的中间件(不论种类)以及相应的view,Django将立即返回。

模板渲染函数

process_template_response(self, request, response)

默认不执行,只有在视图函数的返回结果对象中有render方法才会执行,并把对象的render方法的返回值返回给用户(注意不返回视图函数的return的结果了,而是返回视图函数 return值(对象)中render方法的结果)

异常处理函数

process_exception(self, request, exception)

正常执行是不会执行的

(1)执行完所有 request 方法;

(2)执行所有 process_view方法;

(3)如果视图函数出错,执行process_exception方法,如果第一个中间件的process_exception方法有了返回值就不再执行其他中间件process_exception,直接执行response方法;

(4)执行所有response方法;

响应处理函数

process_response(self, request, response)

process_response() 必须返回 HttpResponse 对象. 这个 response 对象可以是传入函数的那一个原始对象(通常已被修改),也可以是全新生成的。

具体执行的流程

内置中间件的作用

缓存中间件:

django.middleware.cache.UpdateCacheMiddleware

django.middleware.cache.FetchFromCacheMiddleware

开启全站范围的缓存。 如果开启了这些缓存,任何一个由Django提供的页面将会被缓存,缓存时长在CACHE_MIDDLEWARE_SECONDS中配置定义。

会话中间件

django.contrib.sessions.middleware.SessionMiddleware

开启会话支持,session支持中间件,加入这个中间件,会在数据库中生成一个django_session的表。

通用中间件:

django.middleware.common.CommonMiddleware

通用中间件,会处理一些URL,比如baidu.com会自动的处理成www.baidu.com。比如/blog/111会处理成/blog/111/自动加上反斜杠。

CSRF保护中间件

django.middleware.csrf.CsrfViewMiddleware

跨域请求伪造中间件。加入这个中间件,在提交表单的时候会必须加入csrf_token,cookie中也会生成一个名叫csrftoken的值,也会在header中加入一个HTTP_X_CSRFTOKEN的值来放置CSRF攻击。

用户授权中间件:

django.contrib.auth.middleware.AuthenticationMiddleware

他会在每个HttpRequest对象到达view之前添加当前登录用户的user属性,也就是你可以在view中通过request访问user。

消息中间件

django.contrib.messages.middleware.MessageMiddleware

展示一些后台信息给前端页面。如果需要用到消息,还需要在INSTALLED_APPS中添加django.contrib.message才能有效。如果不需要,可以把这两个都删除。

XFrameOptionsMiddleware中间件

django.middleware.clickjacking.XFrameOptionsMiddleware

防止通过浏览器页面跨Frame出现clickjacking(欺骗点击)攻击出现。

可以自己写自定义中间件测试

比如

from django.utils.deprecation import MiddlewareMixin
from django.http import JsonResponse class middleware1(MiddlewareMixin):
def process_request(self, request):
print("中间件1请求") def process_response(self, request, response):
print("中间件1返回")
return response def process_view(self, request, callback, callback_args, callback_kwargs):
print("中间件1view")
raise Exception("asdasd") def process_exception(self, request, exception):
print("中间件1exception") class middleware2(MiddlewareMixin):
def process_request(self, request):
print("中间件2请求") def process_response(self, request, response):
print("中间件2返回")
return response def process_view(self, request, callback, callback_args, callback_kwargs):
print("中间件2view") def process_exception(self, request, exception):
print("中间件2exception") class middleware3(MiddlewareMixin):
def process_request(self, request):
print("中间件3请求") def process_response(self, request, response):
print("中间件3返回")
return response def process_view(self, request, callback, callback_args, callback_kwargs):
print("中间件3view") def process_exception(self, request, exception):
print("中间件3exception") 配置一下
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',
'middleWare.myzx.middleware1',
'middleWare.myzx.middleware2',
'middleWare.myzx.middleware3', ]

参考链接

wsgi

https://www.cnblogs.com/zzzlw/p/9747872.html

https://www.jianshu.com/p/46c2dc59c127

https://baijiahao.baidu.com/s?id=1622776730103957680&wfr=spider&for=pc

Django中间件详解的更多相关文章

  1. Django 2.0 学习(20):Django 中间件详解

    Django 中间件详解 Django中间件 在Django中,中间件(middleware)其实就是一个类,在请求到来和结束后,Django会根据自己的规则在合适的时机执行中间件中相应的方法. 1. ...

  2. Django -- settings 详解

    Django settings详解 1.基础 DJANGO_SETTING_MODULE环境变量:让settings模块被包含到python可以找到的目录下,开发情况下不需要,我们通常会在当前文件夹运 ...

  3. Django -- settings 详解(转)

    Django -- settings 详解   Django settings详解 1.基础 DJANGO_SETTING_MODULE环境变量:让settings模块被包含到python可以找到的目 ...

  4. net core 中间件详解及项目实战

    net core 中间件详解及项目实战 前言 在上篇文章主要介绍了DotNetCore项目状况,本篇文章是我们在开发自己的项目中实际使用的,比较贴合实际应用,算是对中间件的一个深入使用了,不是简单的H ...

  5. Django框架详解之url

    Django基本命令 下载Django pip3 install django 创建一个django project django-admin.py startproject cms 当前目录下会生成 ...

  6. 中间件详解,Django复习

    day74 2018-05-21 课程安排周一: 中间件 auth模块+分析BBS项目需求(小组讨论把表结构设计出来) 1. 今日内容 中间件:http://www.cnblogs.com/liwen ...

  7. Django路由详解

    一.路由基础 1.路由url函数:路由自上而下进行匹配:url(正则路径,视图函数内存地址,默认参数,路由别名) 2.路由正则: 规定开始:^ | 规定结束:$ #url(r'index', view ...

  8. Django session 详解-part II-session

    Django中的session是一个高级工具,它可以让用户存储个人信息以便在下次访问网站中使用这些信息.session的基础还是cookie,但是它提供了一些更加高级的功能.请看下面的一个例子: 使用 ...

  9. 很详细的Django入门详解

    Django 是用Python开发的一个免费开源的Web框架,可以用于快速搭建高性能,优雅的网站!采用了MVC的框架模式,即模型M,视图V和控制器C,也可以称为MVT模式,模型M,视图V,模板T.在学 ...

随机推荐

  1. Java自动化测试框架-07 - TestNG之Factory篇 - 欢快畅游梦幻工厂(详细教程)

    简介 最近忙着装修博客园,没时间更新文章,今天终于抽出时间把上次写的一半的文章给写完了,新的博客园风格,希望大家喜欢.今天继续介绍testng的相关知识--工厂. 工厂允许你动态的创建测试.例如,假设 ...

  2. 永恒之蓝复现(win7/2008)

    Kali对Windows2008/7的MS17010漏洞测试(MSF自带模块) 0x01 说明 其实这个MSF自带的exp模块还是挺让人伤脑筋的,因为它支持的OS并不是很多,也就Windows Ser ...

  3. C++学习笔记3_类.和相关函数

    1. 类*在C++中,struct和class没有明显差别,不同C#,class一定要new(手动开辟内存)出来struct Hero{ char name[64]; int sex;}void pr ...

  4. [考试反思]1031csp-s模拟测试96:常态

    按照smily的说法这一场的大众分暴力分是不是265啊QwQ那我可真是个大垃圾 总算还是回归了常态. T3文件名写错,把“city.in”写成“city,in” 还好,只丢了20分. T2乱打$O(n ...

  5. mysql-清除binlog日志命令

    记录一个清除MySQL里binlog日志的命令,可用在定时任务脚本里. 只保留1天前的日志: PURGE MASTER LOGS BEFORE DATE_SUB(CURRENT_DATE, INTER ...

  6. 「Usaco2005 Dec」清理牛棚(spfa秒杀线段树dp)

    约翰的奶牛们从小娇生惯养,她们无法容忍牛棚里的任何脏东西. 约翰发现,如果要使这群有洁癖的奶牛满意,他不得不雇佣她们中的一些来清扫牛棚, 约翰的奶牛中有N(1≤N≤10000)头愿意通过清扫牛棚来挣一 ...

  7. Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: org/springframework/util/PatternMatchUtils

    { "message": "Handler dispatch failed; nested exception is java.lang.NoClassDefFoundE ...

  8. python——inspect模块

    inspect模块常用功能 import inspect # 导入inspect模块 inspect.isfunction(fn) # 检测fn是不是函数 inspect.isgenerator((x ...

  9. H5+app -- 自动更新

    一.最近做了一个app自动更新功能,用的基本都是网上找得到的. 1.h5+ 规范 :  http://www.html5plus.org/doc/zh_cn/maps.html 2.环形进度条插件:h ...

  10. Eclipse中修改tomcat的部署路径deploypath

    在eclipse上面部署web项目后,它没有将你的项目文件放到tomcat 的目录下面.而是放在了你的工作目录下面. 在tomcat上右键选择“stop” .停止eclipse内的Tomcat服务器 ...