中間介(MiddleWare)

?引子-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 MiddlewareMixinclass MD1(MiddlewareMixin):def process_request(self,request):print "MD1 process_request"def process_response(self,request,response):print "MD1 process_response"return responseclass MD2(MiddlewareMixin):def process_request(self,request):print "MD2 process_request"def process_response(self,request,response):print "MD2 process_response"print responsereturn 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_responsesuper(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方法可以在用戶請求時,做統一的操作非常方便、靈活,比如設置白名單。

?

轉載于:https://www.cnblogs.com/skyflask/p/9823498.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/396434.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/396434.shtml
英文地址,請注明出處:http://en.pswp.cn/news/396434.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

對MariaDB10.0的Sphinx進行擴展

已修改過的文件:http://pan.baidu.com/s/1o8DHvkA 將這兩個文件放到MariaDB的解壓目錄后,再進行安裝 /usr/local/mariadb-10.0.28/storage/sphinx/ 如下是修改的代碼 get_rec ( byte * buf, const byte * key, uint keylen,uint a,uint b,uint c );index…

C++常用特性原理解析

在我的早期印象中,C這門語言是軟件工程發展過程中,出于對面向對象語言級支持不可或缺的情況下,一群曾經信誓旦旦想要用C統治宇宙的極客們妥協出來的一個高性能怪咖。 它駁雜萬分,但引人入勝,出于多(mian)種(shi)原因&a…

容器created狀態_docker容器狀態的轉換實現

一 docker容器狀態轉換圖二 實戰[rootlocalhost ~]# docker infoContainers: 0Running: 0Paused: 0Stopped: 0Images: 3Server Version: 17.09.0-ceStorage Driver: overlayBacking Filesystem: xfsSupports d_type: falseLogging Driver: json-fileCgroup Driver: cgroupfsPlu…

nodejs命令行執行程序_在NodeJS中編寫命令行應用程序

nodejs命令行執行程序by Peter Benjamin彼得本杰明(Peter Benjamin) 在NodeJS中編寫命令行應用程序 (Writing Command-Line Applications in NodeJS) With the right packages, writing command-line apps in NodeJS is a breeze.有了合適的軟件包,用NodeJS編寫命令…

python re findall 效率_python re模塊findall()詳解

今天寫代碼,在寫到鄭澤的時候遇到了一個坑,這個坑是re模塊下的findall()函數。下面我將結合代碼,記錄一下importrestring"abcdefg acbdgef abcdgfe cadbgfe"#帶括號與不帶括號的區別#不帶括號regexre.compile("((\w)\s\w)&quo…

ubuntu16.04配置sonarqube+MySQL

環境:rootubuntu:~# uname -a Linux ubuntu 4.4.0-21-generic #37-Ubuntu SMP Mon Apr 18 18:33:37 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux rootubuntu:~# rootubuntu:~# cat /etc/issue Ubuntu 16.04 LTS \n \lrootubuntu:~#安裝配置mysql:1、更新源…

mysql 多表混全_mysql--淺談多表查詢1

這是對自己學習燕十八老師mysql教程的總結,非常感謝燕十八老師。依賴軟件:mysql5.6系統環境:win連接查詢在談連接查詢之前我們需要對數學上的笛卡爾積有一定的了解現在有兩個集合m和nm (m1,m2,.....mx)n (n1,n2,.....ny)m*n得到的笛卡爾積有…

鼠標固定在屏幕中間_無線電競黑科技,雷柏VT950Q游戲鼠標評測

雷柏作為目前小有聲譽的PC外設品牌,其定位高性能游戲領域的VT系列產品,想必大家也比較熟悉了。VT系列的產品除了有超強的性能以及出色的設計感,同時還都是性價比非常高的產品,即便是采用了旗艦級傳感器,定位最為高端的…

談論源碼_5,000名開發人員談論他們的薪水

談論源碼Let’s dive into the most interesting results from the O’Reilly 2016 Salary Survey of 5,000 developers (which excluded managers and students).讓我們來看看OReilly 2016年薪金調查對5,000名開發人員(其中不包括經理和學生)最有趣的結果。 性別工資差距是真…

WebSnapshotsHelper(HTML轉換為圖片)

1 /// <summary>2 /// WebBrowser Url生成圖片3 /// HTML轉圖片4 /// </summary>5 public class WebSnapshotsHelper6 {7 Bitmap m_Bitmap;8 string m_Url;9 int m_BrowserWidth, m_BrowserHeight, m_ThumbnailWidth,…

兩個多項式相乘求解系數數組算法

題目描述&#xff1a; 給出兩個多項式&#xff0c;最高次冪分別為n和m&#xff0c;求解這兩個系數相乘得到的系數數組。 分析&#xff1a; 最高次冪如果是m和n&#xff0c;那么他們相乘得到的系數數組的最高次冪一定是nm&#xff0c;對于其他的系數&#xff0c;不妨設a[],b[]是…

synchronized 和 reentrantlock 區別是什么_JUC源碼系列之ReentrantLock源碼解析

目錄ReentrantLock 簡介ReentrantLock 使用示例ReentrantLock 與 synchronized 的區別ReentrantLock 實現原理ReentrantLock 源碼解析ReentrantLock 簡介ReentrantLock 是 JDK 提供的一個可重入的獨占鎖&#xff0c;獨占鎖&#xff1a;同一時間只有一個線程可以持有鎖可重入&am…

gulp 和npm_為什么我離開Gulp和Grunt去看npm腳本

gulp 和npmI know what you’re thinking. WAT?! Didn’t Gulp just kill Grunt? Why can’t we just be content for a few minutes here in JavaScript land? I hear ya, but…我知道你在想什么 WAT &#xff1f;&#xff01; 古爾普不是殺死了咕unt嗎&#xff1f; 為什么…

mysql8.0遞歸_mysql8.0版本遞歸查詢

1.先在mysql數據庫添加數據DROP TABLE IF EXISTS dept;CREATE TABLE dept (id int(11) NOT NULL,pid int(11) DEFAULT NULL,name varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,date datetime(0) DEFAULT NULL,PRIMARY KEY (id) USING BTREE) ENGINE…

js 輪播插件

flexslider pc插件 個人用過flickerplate 移動端插件 個人用過個人覺得比較好的移動端插件swiper http://www.swiper.com.cn/ 用過個人覺得比較好的pc端插件待定

計算機中的字符編碼

字符編碼 什么是計算機編碼 計算機只能處理二進制的數據&#xff0c;其它的數據都要進行轉換&#xff0c;但轉換必須要有一套字符編碼(是字符與二進制的一個對應關系)。常用的字符&#xff1a;a-z、0-9、其它的符號等&#xff0c;計算機也不能直接處理。 &#xff08;字符編碼類…

致力微商_致力于自己。 致力于公益組織。

致力微商by freeCodeCamp通過freeCodeCamp 致力于自己。 致力于公益組織。 (Commit to Yourself. Commit to a Nonprofit.) In case you missed it, our October Summit was jam-packed with several big announcements about our open source community.如果您錯過了它&#…

應急照明市電檢測_應急照明如何供電? 如何接線? 圖文分析!

對于大部分剛接觸建筑電氣設計的工作者來說&#xff0c;應急照明的強啟原理一直都是很頭疼的問題。由于不知道應急照明的強啟原理&#xff0c;所以&#xff0c;應急燈具應該用多少根線&#xff0c;其實也就無從談起。下面以文字和圖片結合的方式來說明應急燈怎么接線的&#xf…

win10網速慢

升級到win10之后發現網速特別慢&#xff0c;搜了下&#xff0c;網上的解決辦法果然好使&#xff0c;按照如下操作即可。 返回桌面&#xff0c;按WINR鍵組合&#xff0c;運行gpedit.msc 打開組策略 依次展開管理模板-》網絡-》QoS數據計劃程序-》限制可保留寬帶&#xff0c;雙擊…

ubuntu安裝nodejs

下載nodejs https://nodejs.org/dist/v4.6.0/node-v4.6.0-linux-x64.tar.gz 解壓 tar -zxvf node-v4.6.0-linux-x64.tar.gz 移動到/opt/下 mv node-v4.6.0-linux-x64 /opt/ 創建鏈接 ln -s /opt/node-v4.6.0-linux-x64/bin/node /usr/local/bin/node 轉載于:https://www.cnblog…