中间件函数是 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. 理解 js的 async/await

    async 和await 在干什么? async  用于声明一个function是异步的 await用于等待一个异步方法执行完成(其实我理解的是等待的是一个表达式,就是一个结果), 其中  await ...

  2. 在Windows XP系统下架设FTP服务器需要5个步骤。

    4步win7下简单FTP服务器搭建:http://blog.sina.com.cn/s/blog_3f7e47f20100haur.html 申请网域护照(即帐户),开通免费域名.连接到www.ora ...

  3. Unity3D安卓程序中提示窗与常用静态方法封装

    Unity3D/安卓封装SDK常用方法 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 IO -- - ...

  4. SUST OJ 1674: 入侵与反击(最长不下降子序列)

    1674: 入侵与反击 时间限制: 1 Sec  内存限制: 128 MB提交: 229  解决: 28[提交][状态][讨论版] 题目描述 A国部署的反导系统遇到了一个致命BUG,那就是每一次发射的 ...

  5. HDU 1084:What Is Your Grade?

    Problem Description "Point, point, life of student!" This is a ballad(歌谣)well known in col ...

  6. Assert随笔

    ☆ Assert.notNull(haha, "未找到需要导入的计划1");//haha必须不能为null,if为null则抛出message的异常: Assert.hasText ...

  7. Sort An Unsorted Stack

    Given a stack of integers, sort it in ascending order using another temporary stack. Examples: Input ...

  8. java开发中的常见类和对象-建议阅读时间3分钟

    1.Dao 数据访问对象 此对象用于访问数据库.实现类一般用于用于操作数据库! 一般操作修改,添加,删除数据库操作的步骤很相似,就写了一个公共类DAO类 ,修改,添加,删除数据库操作时 直接调用公共类 ...

  9. greasemonkey修改网页url

    // ==UserScript== // @name JSHE_ModifyFunction // @namespace jshe // @include http://localhost/* // ...

  10. keepalived的配置详解(非常详细)

    keepalived的配置详解(非常详细) 2017-01-22 15:24 2997人阅读 评论(0) 收藏 举报  分类: 运维学习(25)    转载自:http://blog.csdn.net ...