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. mysql如何解除死锁状态

    第一种: 1.查询是否锁表 show OPEN TABLES where In_use > 0; 2.查询进程(如果您有SUPER权限,您可以看到所有线程.否则,您只能看到您自己的线程) sho ...

  2. NOIP201605玩具谜题-解题报告

    NOIP201605玩具谜题-解题报告                                                                         2019-11- ...

  3. 前端技术之:使用webpack构建React程序配置方法

    package.json中需要引入以下依赖:   开发依赖: "@babel/core": "^7.1.2", "@babel/preset-env& ...

  4. MAC配置JAVA环境变量

    一.下载安装文件 地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html jdk-8u144-macosx-x64. ...

  5. 网站安全配置Nginx防止网站被攻击

    https://blog.csdn.net/u011078940/article/details/51426288

  6. 硬件内存模型到 Java 内存模型,这些硬核知识你知多少?

    Java 内存模型跟上一篇 JVM 内存结构很像,我经常会把他们搞混,但其实它们不是一回事,而且相差还很大的,希望你没它们搞混,特别是在面试的时候,搞混了的话就会答非所问,影响你的面试成绩,当然也许你 ...

  7. 入门react

    前言:今天翻到了好久之前学习react时的笔记,拿出来记录一下以免忘掉,里面主要是记录了安装环境,创建项目,启动项目,jsx,组件介绍,组件通信,多层嵌套,路由搭建,路由传参,redux.记录的比较浅 ...

  8. python中字符串的常见操作(一)

    如有字符串: str1 = '192.168.1.1' str2 = 'asdfghjk' str3 = 'Asd fg hj ki' str4 = ' ' str5 = '' 以下是常见操作:# i ...

  9. [LC]26题 Remove Duplicates from Sorted Array (删除排序数组中的重复项)(双指针法)(原地实现)

    ①中文题目 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成 ...

  10. 用IDEA导入Eclipse的JavaWEB项目

    1.File----Open 2.选择项目路径 点击OK,这时候会弹出一个窗口,让你选择本窗口打开项目还是新建一个窗口,这个随意. 3.添加WEB框架 4.添加各种自己需要的jar包 5.添加Tomc ...