一、什么是中间件

中间件,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能。

django中间价官网定义:

Middleware is a framework of hooks into Django’s request/response processing.
It’s a light, low-level “plugin” system for globally altering Django’s input or output.

二、中间件有什么作用

如果你想修改请求。

例如被传送到view中的HttpRequest对象。 或者你想修改view返回的HttpResponse对象,这些都可以通过中间件来实现。

可能你还想在view执行之前做一些操作,这种情况就可以用 middleware来实现。

Django默认的中间件:(在django项目的settings模块中,有一个 MIDDLEWARE变量,其中每一个元素就是一个中间件,如下图)

请求进来是自上而下,通过反射找到类,用for循环来执行。

可以自定义中间件,但是也要写在MIDDLEWARE中,可以在app01下创建一个mymid.py文件来写我们自定义的中间件

每一个中间件都有具体的功能.

三、自定义中间件

中间件可以定义五个方法,分别是:(主要的是process_request和process_response)

1、process_request(self,request)2、process_view(self, request, callback, callback_args, callback_kwargs)3、process_template_response(self,request,response)4、process_exception(self, request, exception)5、process_response(self, request, response)

以上方法的返回值可以是None或一个HttpResponse对象,如果是None,则继续按照django定义的规则向后继续执行,如果是HttpResponse对象,则直接将该对象返回给用户。

1、process_request和process_response

当用户发起请求的时候会依次经过所有的的中间件,这个时候的请求时process_request,最后到达views的函数中,views函数处理后,在依次穿过中间件,这个时候是process_response,最后返回给请求者。

上述截图中的中间件都是django中的,我们也可以自己定义一个中间件,我们可以自己写一个类,但是必须继承MiddlewareMixin。

2、process_view

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

该方法有四个参数:

request是HttpRequest对象。

view_func是Django即将使用的视图函数。 (它是实际的函数对象,而不是函数的名称作为字符串。)

view_args是将传递给视图的位置参数的列表(无名分组分过来的值).

view_kwargs是将传递给视图的关键字参数的字典(有名分组分过来的值)。 view_args和view_kwargs都不包含第一个视图参数(request)。

Django会在调用视图函数之前调用process_view方法。

它应该返回None或一个HttpResponse对象。 如果返回None,Django将继续处理这个请求,执行任何其他中间件的process_view方法,然后在执行相应的视图。 如果它返回一个HttpResponse对象,Django不会调用适当的视图函数。 它将执行中间件的process_response方法并将应用到该HttpResponse并返回结果。

3、process_exception

process_exception(self, request, exception)

该方法两个参数:

一个HttpRequest对象

一个exception是视图函数异常产生的Exception对象。

这个方法只有在视图函数中出现异常了才执行,它返回的值可以是一个None也可以是一个HttpResponse对象。如果是HttpResponse对象,Django将调用模板和中间件中的process_response方法,并返回给浏览器,否则将默认处理异常。如果返回一个None,则交给下一个中间件的process_exception方法来处理异常。它的执行顺序也是按照中间件注册顺序的倒序执行。

4、process_template_response(self,request,response)

该方法对视图函数返回值有要求,必须是一个含有render方法类的对象,才会执行此方法。

如何自定义中间件?

自定义中间件的模板

def 

根据代码:需要定义一个中间件的工厂函数 simple_middleware,然后返回一个可以被调用的中间件 middleware

中间件工厂函数 simple_middleware 需要接收一个可以调用的 get_response 对象

返回的中间件也是一个可以被调用的对象,并且像视图一样需要接收一个request对象参数,返回一个response对象。

例如:在一个模块中新建一个middleware.py文件

在文件中写入以下代码:

定义好中间件后,需要在settings.py 文件中添加注册中间件

定义一个视图进行测试

四、中间件应用场景

1、做IP访问频率限制

某些IP访问服务器的频率过高,进行拦截,比如限制每分钟不能超过20次。

2、URL访问过滤

如果用户访问的是login视图(放过)

如果访问其他视图,需要检测是不是有session认证,已经有了放行,没有返回login,这样就省得在多个视图函数上写装饰器了!

3、缓存(还记得CDN吗?)

客户端请求来了,中间件去缓存看看有没有数据,有直接返回给用户,没有再去逻辑层 执行视图函数

django redirect传递参数_Django中间件相关推荐

  1. django redirect传递参数_Django 视图层(四):视图函数 - views.py

    介绍 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图 ...

  2. python中redirect如何传值_flask的重定向(redirect)传递参数的方法

    flask中的重定向redirect方法常常被用来跳转页面,那redirect在跳转页面的同时能不能传递我们下一个页面需要的参数呢? 带着这个问题我看了redirect()的源码,如下: 1 def ...

  3. django {%url %}传递参数 url 传参 报错

    无参数传递的 url view 等路由传递,不再赘述 ,一般前端如下,后端通过url views来处理 href="{% url 'article:redit_article' %} 但是如 ...

  4. python 反向传值_Django中reverse反转并且传递参数的方法

    在写项目的过程中,有些函数不可避免的需要传入参数进去,所以我们在使用reverse进行反转时也需要传递参数.这个时候我们就可以使用 'reverse()' 中的 kwargs 参数了,它将传入一个字典 ...

  5. Django通过URL传递参数的4种方法

    [转自ian的个人博客]http://www.icodelogic.com/?p=501 感谢ian的总结! 1 无参数情况 配置URL及其视图如下: (r'^hello/$', hello)  de ...

  6. Django(part11)--利用UUID传递参数

    学习笔记,仅供参考 参考自:Django打造大型企业官网: 本系列Blog以应用为主,理论基础部分我在后端专栏的Django系列博客已经写过了,如果有些需要补充的知识点,我会在这个系列中,尽量详细的写 ...

  7. redirect通过url_for传递参数_Excel VBA解读 | 进阶篇(127):Sub过程的参数传递技术...

    学习Excel技术,关注微信公众号: excelperfect 前面用了几篇文章详细讲解了Sub过程的语法及相关知识,本文进一步讲解与Sub过程相关的一些"重要事项",以进一步理解 ...

  8. angular路由传递参数_@medux 路由篇

    欢迎您开始@medux 之旅,建议您依次阅读以下 4 篇文章,这将耗费您大约 30 分钟. 为什么你需要 @medux @medux 基础概念速览 @medux 路由篇 @medux 数据流 第 3 ...

  9. ASP.NET页面通过URL传递参数(一)(转载)

    解决的方法一般有3种: 1.设置web.config文件 <system.web>  ......  <globalization requestEncoding="gb2 ...

最新文章

  1. H5 画布解决跨域问题,画布保存为图片显示在页面上
  2. Spring Framework 6 将采用 Java 17,是时候将你的应用升级了
  3. Keil5.15使用GCC编译器链接.a库文件
  4. 让 Linux 防火墙新秀 nftables 为你的 VPS 保驾护航
  5. 20211018 一些特殊矩阵
  6. .NET中的设计模式---由吃龙虾想到的
  7. C++面试题目(五)
  8. JS成员函数声明位置优化
  9. 字符串、文件操作,英文词频统计预处理
  10. 一起谈.NET技术,NHibernate 3.0.0.Alpha1 发布及新特性介绍
  11. jquery thinkphp mysql_ThinkPHP5+jQuery+MySql如何实现投票功能
  12. Gentoo学习笔记
  13. apache-xmlrpc-3.1.3-bin.tar.bz2
  14. LINUX上开发ffmpeg程序,查看链接的库
  15. Android图片转化黑白图片,图像二值化,生成图像二值化后的黑白图像和图像矩阵(无压缩0,1矩阵),可灵活设置二值化值域
  16. html下拉加载实现原理,GitHub - sybiele/wxPull: 原生JS实现微信公众号或网页使用下拉加载和上拉刷新...
  17. 【伪大数据】对QQ空间指定好友2017年说说数据的分析
  18. OFDM技术与FDM技术区别
  19. java如何将mp4写入光盘_iOS - 读取/写入mp4视频的XMP元数据
  20. 如何把IDEA中设置像eclipse默认铺开包层次结构

热门文章

  1. 如何找到Partner 相关设置里哪些是SAP 标准deliver的,哪些是我们自己创建的
  2. 如何使用命令行拿到SAP Kyma的Lambda Function明细
  3. 如何自动打开function对应的ABAP class
  4. Sprint Application bootstrap的研究和调试
  5. SAP云平台 CloudFoundry环境下的space guid
  6. 从SAP客户主数据里直接创建商机(Opportunity)
  7. 用pc装华为服务器系统,pc安装服务器系统安装
  8. 如果要用thinkphp框架_php需要改哪些配置,thinkPHP框架动态配置用法实例分析
  9. intelliJ Idea 添加 Tomcat部署(详细步骤)
  10. matlab 求复数的模长,matlab计算带有复数的函数,最后求复数函数的模,结果里面却有...