中间件函数是 django 框架为我们预留的函数接口, 让我们可以干预请求和应答的过程

1. 获取浏览器端的IP地址:

使用 request.META[‘REMOTE_ADDR’]

2. 使用中间件

1. 创建中间件:

新建 middlewere.py 的文件

from django.htto import HttpResponse

​

class BlockIPSMiddleware(object):

    """中间件类"""

    EXCLUDE_IPS = ['127.0.0.1']

    # django 为我们预留的函数

    def process_view(request, view_func, *args, **kwargs):

        """

        中间件函数

        视图函数调用之前会调用它

        """

        user_ip = request.META['REMOTE_ADDR']

        if user_ip in BlockIPSMiddleware. EXCLUDE_IPS:  

            return HttpResponse("禁止使用!")

2. 注册中间件:

# 注册中间件

MIDDLEWARE_CLASSES = [

    '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',

    'myapp.middleware.BlockIPSMiddleware' # 注册中间件类

]

3. 流程:

  1. 浏览器发送请求
  2. Django网站, 产生 request 对象
  3. 调用中间件类中的 process_request
  4. url 的匹配(通过 URL 找对应的视图)
  5. 调用中间件类中的 process_view
  6. 调用我们自己的视图 view
  7. 调用中间件类中的 process_response
  8. process_response 将响应内容 返回给浏览器

4. 在类中定义中间件预留函数:

  • __init__: 服务器相应第一个请求的时候调用
  • process_request: 是在产生 request 对象, 进行 url 匹配之前调用
  • process_view: 是 url 匹配之后, 调用视图函数之前调用
  • process_response: 视图函数调用之后, 内容返回给浏览器之前调用
  • process_exception: 视图函数调用之后, 内容返回给浏览器之前
  • 如果注册的多个中间件类中包含 process_exception 函数的时候, 调用的顺序跟注册的顺序是相反的

也就是:

  • process_request(self,request)
  • process_view(self, request, callback, callback_args, callback_kwargs)
  • process_template_response(self,request,response)
  • process_exception(self, request, exception)
  • process_response(self, request, response
class TestMiddleware(object):

    """中间类"""

    def __init__(self):

        """服务器重启之后, 接受第一个请求时调用"""

        print("__init__执行")

    def process_request(self, request):

        """产生 request 对象之后, url 匹配之前调用"""

        print("process_request__中间件函数执行")

    def process_view(self, request, **args, **kwargs):

        """ url 匹配之后, 调用视图函数之前调用"""

        print("process_view中间件函数调用")

    def process_response(self, request, response):

        """试图函数调用之后, 内容返回浏览器之前"""

        print("process_response__中间件函数执行")

注意: 如果注册的多个中间件类中包含 process_exception 函数的时候, 调用的顺序跟注册的顺序是相反的

class ExceptionTest1Middleware(object):

    def process_exception(self, request, exception):

        """视图函数调用之后, 内容返回浏览器之前"""

        print("process_exception1中间件哈桉树执行")

class ExceptionTest2Middleware(object):

    def process_exception(self, request, exception):

        """视图函数调用之后, 内容返回浏览器之前"""

        print("process_exception2中间件哈桉树执行")

5. 中间件应用场景

由于中间件工作在 视图函数执行前、执行后(像不像所有视图函数的装饰器!)适合所有的请求/一部分请求做批量处理

1、做IP限制

放在 中间件类的列表中,阻止某些IP访问了;

2、URL访问过滤

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

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

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

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

参考资料:

https://www.cnblogs.com/lzpblog/p/6483442.html

https://www.cnblogs.com/huchong/p/7819296.html

https://www.cnblogs.com/amou/p/9625366.html

Django中间件执行流程的更多相关文章

  1. Django中间件执行顺序

    中间件 Django中的中间件是一个轻量级.底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出.中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django ...

  2. koa2入门--03.koa中间件以及中间件执行流程

    //中间件:先访问app的中间件的执行顺序类似嵌套函数,由外到内,再由内到外 //应用级中间件 const koa = require('koa'); var router = require('ko ...

  3. {Django基础九之中间件} 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证

    Django基础九之中间件 本节目录 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证 六 xxx 七 xxx 八 xxx 一 前戏 我们在前面的课程中已经学会了 ...

  4. django中间件及中间件实现的登录验证

    1.定义 一个用来处理Django的请求和响应的框架级别的钩子(函数),相对比较轻量级,并且在全局上改变django的输入与输出(使用需谨慎,否则影响性能) 直白的说中间件就是帮助我们在视图函数执行之 ...

  5. session与cookie,django中间件

    0819自我总结 一.session与cookie 1.django设置session request.session['name'] = username request.session['age' ...

  6. cookie与session django中间件

    目录 一.什么是cookie 二.django中操作cookie 2.1 如何操作cookie 2.2 操作cookie 三.什么是session 四.django中操作session 4.1 创建c ...

  7. (day58)十、Cookie、Session、Token、Django中间件

    目录 一.Cookie (一)由来 (二)什么是Cookie (三)Django中操作Cookie (1)设置Cookie (2)获取Cookie (3)删除Cookie 二.Session (一)由 ...

  8. cookie和session django中间件

    目录 一.cookie和session 1. 为什么要有cookie和session 二.cookie 1. 什么是cookie 2. django中关于cookie的使用 (1)后端设置cookie ...

  9. python中django中间件

    一.中间件 所谓的中间件,就是存在socket和视图函数中间的一种相当于过滤的机构. 中间件共分为: (1)process_request(self,request) (2)process_view( ...

随机推荐

  1. C语言基础:初级指针 分类: iOS学习 c语言基础 2015-06-10 21:50 30人阅读 评论(0) 收藏

    指针:就是地址. &   取地址运算符 %p   打印地址占位符 int a=0; printf("%p ",&a);    指针变量:用来存放地址的变量 定义: ...

  2. Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.ActionBar.setDisplayShowHomeEnabled(boolean)' on a null object reference

    /********************************************************************************* * Caused by: java ...

  3. SendTo MD5 - imsoft.cnblogs

    SendTo MD5 is a small application that allows you to calculate and compare MD5 checksums of files an ...

  4. CTF-练习平台-Misc之 再来一道隐写

    十二.再来一道隐写 下载文件后打开,用常用的几个方法都没有找到有用的信息,然后观察图片发现搞度有点低,所以用WinHex打开把图片高度改大,保存.再次打开图片发现flag

  5. jquery中的 .parent()

    ☆ 遍历 - .parent() 方法: 查找每个段落的带有 "selected" 类的父元素: <body> <ul class="level-1&q ...

  6. JUC集合之 CopyOnWriteArrayList

    CopyOnWriteArrayList介绍 它相当于线程安全的ArrayList.和ArrayList一样,它是个可变数组:但是和ArrayList不同的时,它具有以下特性: 它最适合于具有以下特征 ...

  7. 一组十六进制的字符串每两个转成对应值的byte

    /// <summary> /// 一组十六进制的字符串每两个转成对应值的byte,比如4142 会成 AB对应的byte列表 /// </summary> /// <p ...

  8. Dynamics CRM 2011 怎么根据记录的etc参数值找到实体英文名和根据etc参数值或英文名称找到其实体中文名称

    一.平常我们可以打开CRM2011一条已创建的记录,通过JScript方法获取实体英文名的方法是:按F12,输入contentIFrame.Xrm.Page.data.entity.getEntity ...

  9. oracle 恢复备份

    select * from dbconninfo update dbconninfo set url = 'jdbc:oracle:thin:@(description=(address_list=( ...

  10. Mycat 数据库分库分表中间件

    http://www.mycat.io/ Mycat 国内最活跃的.性能最好的开源数据库中间件! 我们致力于开发高性能的开源中间件而努力! 实体书Mycat权威指南 »开源投票支持Mycat下载 »s ...