天天看點

Python學習---Django拾遺180328

Python學習---Django拾遺

前台發送URL請求到Django的中間件進行内容校驗,完成校驗後到達路由映射檔案url.py,然後調用視圖函數views.py裡面的函數進行内容處理【 1.操作資料庫進行資料讀寫  2. 調用前台的模版内容】最後傳回字元串給前台進行頁面的渲染【這裡回去的時候也會經過中間件】。

<b> </b>

Django中間件類似于Java架構中的攔截器之類的東西,就是在請求到達我們要操作的函數之前添加的一些判斷之類的操作。

應用場景: 适用于全局的操作,對所有的使用者請求/使用者傳回資料都需要處理的情況。process_request适用于請求到達之前已經執行的操作,類似防護的操作[例如,csrf中間件,過濾器,自定義請求頭];

Django中間件即類中的方法執行順序是Django固定的,不能更改執行順序,函數名稱也不能更改【如果自定義了MiddlewareMixin的話,可以不使用固定的名稱】

注:這裡的函數是不需要全部寫的,也就是process_request和process_response可有可無

Python學習---Django拾遺180328

中間件中可以定義四個方法,分别是:

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)

中間件執行個體

建立中間件路徑【檔案夾+檔案】

Python學習---Django拾遺180328

settings.py

urls.py

views.py

plugin/handler.py

templates/XXX.html

    無

頁面顯示;

正常通路執行順序:

Python學習---Django拾遺180328

中間件request請求中傳回response效果:

Python學習---Django拾遺180328
Python學習---Django拾遺180328

另外其他的函數執行效果:

Python學習---Django拾遺180328

Django為使用者實作防止跨站請求僞造的功能,通過中間件 django.middleware.csrf.CsrfViewMiddleware 來完成。而對于django中設定防跨站請求僞造功能有分為全局和局部。

全局:

  中間件 django.middleware.csrf.CsrfViewMiddleware

局部:

@csrf_protect,為目前函數強制設定防跨站請求僞造功能,即便settings中沒有設定全局中間件。

@csrf_exempt,取消目前函數防跨站請求僞造功能,即便settings中設定了全局中間件。

注: from django.views.decorators.csrf import csrf_exempt,csrf_protect

settings.py裡面如果未注釋掉CSRF驗證【即需要CSRF驗證】

我們的get請求可以通過,post請求會被攔截

Python學習---Django拾遺180328

Django裡面使用form的post請求發送資料的時候,一定是return了一個render對象,且HTML的form表單内使用了{% csrf_token %}進行标記,此時前台的HTML裡面會多出一行csrf的token同時會緩存一份到Cookie裡面。同理,如果我們需要ajax發送post請求的時候,是需要從Cookie裡面擷取token[從截圖可以看到Cookie裡面token的key是csrftoken]并添加到請求頭[request-header]裡讓Django進行驗證的。

Python學習---Django拾遺180328
Python學習---Django拾遺180328

Ajax請求CSRF執行個體

templates/login.html

PS: 擷取request裡面的請求資訊,可以使用斷點列印,我們可以看出我們request裡的header經過Django處理後在Meta裡面呢,且字段名前添加了HTTP的字首。

Python學習---Django拾遺180328
Python學習---Django拾遺180328

其他

Python學習---Django拾遺180328

由于Django是動态網站,所有每次請求均會去資料進行相應的操作,當程式通路量大時,耗時必然會更加明顯,最簡單解決方式是使用:緩存,緩存将一個某個views的傳回值儲存至記憶體或者memcache中,5分鐘内再有人來通路時,則不再去執行view中的操作,而是直接從記憶體或者Redis中之前緩存的内容拿到,并傳回。

緩存适用于固定内容且通路量大,大型檔案内容,不具有實時性的内容。

Django中提供了6種緩存方式:

開發調試 --&gt;  什麼都不幹 記憶體 檔案 資料庫 Memcache緩存(python-memcached子產品)   --&gt;在另外一台伺服器上 Memcache緩存(pylibmc子產品)

配置:

開發調試

記憶體:

檔案:

資料庫:

Memcache緩存(python-memcached子產品)

Memcache可以了解為另外一個伺服器的記憶體,是記憶體級别的緩存;

内容以Key-Value形式存儲,整體的Memcache就是一個大字典

注:memache中如果有伺服器故障,因為memacahe裡面沒有檢測機制,隻能自己監控該子產品,更改子產品裡面的接口方法處理

Django中提供了3種緩存方式:

全棧使用緩存 單獨視圖緩存 局部視圖使用

A. 全棧使用的配置

Python學習---Django拾遺180328

B.單獨視圖緩存

C.局部視圖緩存

Html檔案内寫

單獨視圖和局部視圖執行個體

templates/part.html

檔案緩存之單獨視圖緩存 :

Python學習---Django拾遺180328

檔案緩存之局部視圖緩存 :

Python學習---Django拾遺180328

全棧使用執行個體

其餘同部分的單獨的使用...

Python學習---Django拾遺180328

全棧中間件代碼分析:

from django.middleware.cache import FetchFromCacheMiddleware

Python學習---Django拾遺180328

from django.middleware.cache import UpdateCacheMiddleware

Python學習---Django拾遺180328

bootStrap 一個內建css,js的檔案