引子-Django的生命周期

在学习中间介之前,我们先来回顾一下Django的生命周期:用户发起请求,请求会被发送到urlconf中的url,然后会指向对应的views函数进行处理,views函数处理完成后,用模板渲染好html,然后返回给用户的浏览器。

加上中间介的流程如下:

在Django中的setttings文件有配置middleware

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

执行顺序从上到下。

自定义中间介

1、自定义中间介

新建一个名为middle的包,下面新建文件md.py,

内容如下:

from django.utils.deprecation import MiddlewareMixin

class MD1(MiddlewareMixin):
def process_request(self,request):
print "MD1 process_request" def process_response(self,request,response):
print "MD1 process_response"
return response class MD2(MiddlewareMixin):
def process_request(self,request):
print "MD2 process_request" def process_response(self,request,response):
print "MD2 process_response"
print response
return response

  

2、setttings文件配置

MIDDLEWARE新增中间介配置:

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',
'middle.md1.MD1',
'middle.md1.MD2',
]

  

3、视图函数

views.py

def md(request):
print "views function"
return HttpResponse('execute view function')

  

4、urls.py文件

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/', views.index),
url(r'^mf/', views.mf),
url(r'^fm/', views.fm),
url(r'^myform/', views.myform),
url(r'md',views.md), ]

 

5、访问URL

浏览器返回视图函数的内容:

后台执行:

中间介依次执行,

MD1的process_request,MD2的process_request
MD2的process_response,MD1的process_response

中间介的response值为视图函数的返回值。

 

class MD1(MiddlewareMixin):
def process_request(self,request):
print "MD1 process_request"
#process_request函数有返回值时,会直接返回给用户,而不往下执行。
return HttpResponse('MD1 process_request') def process_response(self,request,response):
print "MD1 process_response"
return response

  

执行结果为:

多个middleware的整体执行流程如下:

MiddlewareMixin函数

源码

class MiddlewareMixin(object):
#构造函数执行父类的构造函数
def __init__(self, get_response=None):
self.get_response = get_response
super(MiddlewareMixin, self).__init__() def __call__(self, request):
response = None
#如果当前中间介有process_request方法,则执行
if hasattr(self, 'process_request'):
response = self.process_request(request)
#如果当前中间介没有process_request方法,则执行下一个中间介的__call__(),依次循环执行下去
if not response:
response = self.get_response(request)
#执行当前中间介的process_reponse方法
if hasattr(self, 'process_response'):
response = self.process_response(request, response)
return response

  7、8、9版本里面process_request和process_response方法都是必须写的,10版本以后可以不写,但是为了过渡,最好写上。

每个中间介,可能只有process_request,也可能只有process_response方法。

总结

中间介整体执行流程

中间介应用场景

对于所有的用户统一的请求都需要处理,这时就需要中间介可以搞定,如果是部分用户请求,可以用装饰器进行处理。

csrf是通过判断request的header里面是否有csrf参数。

最常用的方法

process_request

因为process_request方法可以在用户请求时,做统一的操作非常方便、灵活,比如设置白名单。

中间介(MiddleWare)的更多相关文章

  1. 介介介是一个ORM

    介个是一个ORM,介个ORM基于Dapper扩展. 为什么需要一个ORM呢? 支持简单的LINQ查询 但是不能连表查询,why?why?why?为什么不能连接查询 ^.^ ok.但是就是不支持.哈哈哈 ...

  2. 用Middleware给ASP.NET Core Web API添加自己的授权验证

    Web API,是一个能让前后端分离.解放前后端生产力的好东西.不过大部分公司应该都没能做到完全的前后端分离.API的实现方式有很 多,可以用ASP.NET Core.也可以用ASP.NET Web ...

  3. [转]Writing Custom Middleware in ASP.NET Core 1.0

    本文转自:https://www.exceptionnotfound.net/writing-custom-middleware-in-asp-net-core-1-0/ One of the new ...

  4. [转]用Middleware给ASP.NET Core Web API添加自己的授权验证

    本文转自:http://www.cnblogs.com/catcher1994/p/6021046.html Web API,是一个能让前后端分离.解放前后端生产力的好东西.不过大部分公司应该都没能做 ...

  5. [译]Writing Custom Middleware in ASP.NET Core 1.0

    原文: https://www.exceptionnotfound.net/writing-custom-middleware-in-asp-net-core-1-0/ Middleware是ASP. ...

  6. 解读ASP.NET 5 & MVC6系列(6):Middleware详解

    在第1章项目结构分析中,我们提到Startup.cs作为整个程序的入口点,等同于传统的Global.asax文件,即:用于初始化系统级的信息(例如,MVC中的路由配置).本章我们就来一一分析,在这里如 ...

  7. SQL Server 的 Statistics 簡介

    當你要清空「資料表(table)」,或倒入大量「資料(data;record)」,或公司「資料庫(database)」改用新版本要資料大搬家…等情形,不只是要重建「索引(index)」,還應要重建或更 ...

  8. 在ASP.NET Core使用Middleware模拟Custom Error Page功能

    一.使用场景 在传统的ASP.NET MVC中,我们可以使用HandleErrorAttribute特性来具体指定如何处理Action抛出的异常.只要某个Action设置了HandleErrorAtt ...

  9. ASP.NET Core 开发-中间件(Middleware)

    ASP.NET Core开发,开发并使用中间件(Middleware). 中间件是被组装成一个应用程序管道来处理请求和响应的软件组件. 每个组件选择是否传递给管道中的下一个组件的请求,并能之前和下一组 ...

随机推荐

  1. win10想说爱你不容易——安装.net3.5也是一个坑(已有完美解决方法)

    最终完美解决方法:经过多次波折,终于找到无法正常安装.net3.5的原因了,是因为已删除的用户还有注册表残留导致的,而且这个问题还会影响一个win10更新的安装,导致每天更新失败,撤销更新... 详见 ...

  2. 18年10月30日 NOIP模拟赛

    T1 jkl 题解 显然每次都取a[i]的最大值/最小值,并更新a[i]即可 用数据结构维护这一操作..得分看常数 事实上用v[i]记录权值为i的个数,然后for乱搞就可以了... 其它乱搞做法能获得 ...

  3. #002 WebStrom Live Templete 使用说明

        WebStrom Live Template 使用说明 2016-03-30 20:33:52 星期三 WebStrom是前端一个强大的开发IDE.目前前端主要的开发工具有 Sublime T ...

  4. Git 如何上传文件夹

    Github开源代码库以及版本控制系统,可以托管各种git库,并提供web访问界面.很多朋友喜欢喜欢将个人Blog或小型项目托管到github,这样既方便又简单. 下面介绍如何将本地文件上传到gith ...

  5. vim高级操作命令

    1.首先在命令模式下,输入“:set nu”显示行号:通过行号确定你要删除的行:命令输入“:32,65d”,回车键,32-65行就被删除了,很快捷吧如果无意中删除错了,可以使用‘u’键恢复(命令模式下 ...

  6. Java并发编程--7.Java内存操作总结

    主内存和工作内存 工作规则 Java内存模型, 定义变量的访问规则, 即将共享变量存储到内存和取出内存的底层细节  所有的变量都存储在主内存中,每条线程有自己的工作内存,工作内存中用到的变量, 是从主 ...

  7. windows 下搭建git服务器,及问题处理。

    最近要做一个源码管理服务器,权衡了一下还是git最适合,搭建服务器前看了网上一些windows下搭建git服务器的帖子,感觉还比较简单,没有太多需要配置的地方,于是开始动手. 我选择的是 gitfor ...

  8. 集合之HashTable

    在java中与有两个类都提供了一个多种用途的hashTable机制,他们都可以将可以key和value结合起来构成键值对通过put(key,value)方法保存起来,然后通过get(key)方法获取相 ...

  9. smtp发送html报告与日志附件图片png

    1.非ssl发送: 授权码机制,开启smtp,获取授权码以qq邮箱为例: 附件展示: #!/usr/bin/python3 import os import smtplib from email.mi ...

  10. P1353 [USACO08JAN]跑步Running

    题目描述 The cows are trying to become better athletes, so Bessie is running on a track for exactly N (1 ...