欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Django教程筆記之中間件middleware詳解

 更新時間:2018年08月01日 09:52:15   作者:自在逍遙  
Django 中的中間件(middleware),是一個鑲嵌到Django的request/response處理機制中的一個hooks框架,是一個修改django全局輸入輸出的一個底層插件系統(tǒng)。這篇文章主要給大家介紹了關于Django教程筆記之中間件middleware的相關資料,需要的朋友可以參考下

中間件介紹

中間件顧名思義,是介于request與response處理之間的一道處理過程,相對比較輕量級,并且在全局上改變django的輸入與輸出。因為改變的是全局,所以需要謹慎實用,用不好會影響到性能。

每個中間件都會負責一個功能,例如,AuthenticationMiddleware,與sessions處理相關。

激活中間件

需要在settings.py配置文件中,配置MIDDLEWARE_CLASSES:

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.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

當然你也可以不試用任何的中間件,這個可以設置為空。

中間件順序

一般我們我們從瀏覽器發(fā)出一個請求 Request,得到一個響應后的內容 HttpResponse ,這個請求傳遞到 Django的過程如下,process request 和 process response的執(zhí)行順序正好相反,如下圖所示:

也就是說,每一個請求都是先通過中間件中的 process_request 函數(shù),這個函數(shù)返回 None 或者 HttpResponse 對象,如果返回前者,繼續(xù)處理其它中間件,如果返回一個 HttpResponse,就處理中止,返回到網(wǎng)頁上。
中間件不用繼承自任何類(可以繼承 object ),下面一個中間件大概的樣子:

class CommonMiddleware(object):
 def process_request(self, request):
 return None

 def process_response(self, request, response):
 return response

需要用到的幾個hook:

  • process_request()
  • process_exception() (only if the view raised an exception)
  • process_template_response()
  • process_response()

常用的中間件組件:

1. Sessions

2. Authentication

3. CSRF Protection

4. GZipping Content

例如,比如我們要做一個 流量統(tǒng)計

class BlockedIpMiddleware(object):
 def process_request(self, request):
   ...數(shù)據(jù)庫拿access值
   access = access+1
   ...存起來,類似這個原理  

這里的代碼的功能就是 簡單的訪問一次加一次,把這個中間件的 Python 路徑寫到settings.py中

MIDDLEWARE_CLASSES = (
 'zjj.middleware.BlockedIpMiddleware',
 ...其它的中間件
)

Django 會從 MIDDLEWARE_CLASSES 中按照從上到下的順序一個個執(zhí)行中間件中的 process_request 函數(shù),而其中 process_response 函數(shù)則是最前面的最后執(zhí)行。

二,再比如,我們在網(wǎng)站放到服務器上正式運行后,DEBUG改為了 False,這樣更安全,但是有時候發(fā)生錯誤不能顯示錯誤詳情頁面,有沒有辦法處理好這兩個事情呢?

普通訪問者看到的是友好的報錯信息

管理員看到的是錯誤詳情,以便于修復 BUG

當然可以有,利用中間件就可以做到!代碼如下:

import sys
from django.views.debug import technical_500_response
from django.conf import settings

class UserBasedExceptionMiddleware(object):
 def process_exception(self, request, exception):
  if request.user.is_superuser or request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS:
   return technical_500_response(request, *sys.exc_info())

把這個中間件像上面一樣,加到你的 settings.py 中的 MIDDLEWARE_CLASSES 中,可以放到最后,這樣可以看到其它中間件的 process_request的錯誤。

當訪問者為管理員時,就給出錯誤詳情,比如訪問本站的不存在的頁面。

普通人看到的是普通的 404(自己點開看看),而我們卻可以看到。

三,分享一個簡單的識別手機的中間件,更詳細的可以參考這個:django-mobi

MOBILE_USERAGENTS = ("2.0 MMP","240x320","400X240","AvantGo","BlackBerry",
 "Blazer","Cellphone","Danger","DoCoMo","Elaine/3.0","EudoraWeb",
 "Googlebot-Mobile","hiptop","IEMobile","KYOCERA/WX310K","LG/U990",
 "MIDP-2.","MMEF20","MOT-V","NetFront","Newt","Nintendo Wii","Nitro",
 "Nokia","Opera Mini","Palm","PlayStation Portable","portalmmm","Proxinet",
 "ProxiNet","SHARP-TQ-GX10","SHG-i900","Small","SonyEricsson","Symbian OS",
 "SymbianOS","TS21i-10","UP.Browser","UP.Link","webOS","Windows CE",
 "WinWAP","YahooSeeker/M1A1-R2D2","iPhone","iPod","Android",
 "BlackBerry9530","LG-TU915 Obigo","LGE VX","webOS","Nokia5800")

class MobileTemplate(object):
 """
 If a mobile user agent is detected, inspect the default args for the view 
 func, and if a template name is found assume it is the template arg and 
 attempt to load a mobile template based on the original template name.
 """

 def process_view(self, request, view_func, view_args, view_kwargs):
  if any(ua for ua in MOBILE_USERAGENTS if ua in 
   request.META["HTTP_USER_AGENT"]):
   template = view_kwargs.get("template")
   if template is None:
    for default in view_func.func_defaults:
     if str(default).endswith(".html"):
      template = default
   if template is not None:
    template = template.rsplit(".html", 1)[0] + ".mobile.html"
    try:
     get_template(template)
    except TemplateDoesNotExist:
     pass
    else:
     view_kwargs["template"] = template
     return view_func(request, *view_args, **view_kwargs)
  return None

再舉一個本地化的中間件的例子:

class LocaleMiddleware(object):

 def process_request(self, request):

  if 'locale' in request.cookies:
   request.locale = request.cookies.locale
  else:
   request.locale = None

 def process_response(self, request, response):

  if getattr(request, 'locale', False):
   response.cookies['locale'] = request.locale

就是將cookies中的locale設置給request中的locale,供給后面使用。

這部分參考了django官方文檔以及網(wǎng)絡上的一些教程,這里也非常感謝這些前輩的分享。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關文章

  • python中24小時制轉換為12小時制的方法

    python中24小時制轉換為12小時制的方法

    最近需要實現(xiàn)一個需求,求用戶輸入24小時制的時間,然后顯示12小時制的時間。具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • python中實現(xiàn)詞云圖的示例

    python中實現(xiàn)詞云圖的示例

    這篇文章主要介紹了python中實現(xiàn)詞云圖的示例,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-12-12
  • Selenium瀏覽器自動化如何上傳文件

    Selenium瀏覽器自動化如何上傳文件

    本文主要介紹了Selenium瀏覽器自動化如何上傳文件,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04
  • 總結網(wǎng)絡IO模型與select模型的Python實例講解

    總結網(wǎng)絡IO模型與select模型的Python實例講解

    同步、異步、阻塞、非阻塞,當這些網(wǎng)絡IO名詞堆到一起時難免使編程初學者感到困惑,這里我們就來為大家總結網(wǎng)絡IO模型與select模型的Python實例講解:
    2016-06-06
  • Django項目單字段區(qū)間查詢的實現(xiàn)

    Django項目單字段區(qū)間查詢的實現(xiàn)

    在Django項目中會碰到一些需求就是查詢某個表中的一些字段從某日到某日的數(shù)據(jù),你可以像在SQL中那樣使用SELECT語句來查找指定字段,本文就來介紹兩種方法,感興趣的可以了解一下
    2023-10-10
  • Django 導出項目依賴庫到 requirements.txt過程解析

    Django 導出項目依賴庫到 requirements.txt過程解析

    這篇文章主要介紹了Django 導出項目依賴庫到 requirements.txt過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • 如何利用python web框架做文件流下載的實現(xiàn)示例

    如何利用python web框架做文件流下載的實現(xiàn)示例

    這篇文章主要介紹了如何利用python web框架做文件流下載的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • 用python分割TXT文件成4K的TXT文件

    用python分割TXT文件成4K的TXT文件

    ipod雖然很酷,但它的電子書功能卻弱到了家,只支持看不到4K的txt格式,于是我只好用python寫了個工具,來拆分我的txt文件,源碼如下
    2009-05-05
  • Python學習之流程控制與條件判斷總結

    Python學習之流程控制與條件判斷總結

    這篇文章主要為大家介紹了Python中的流程控制與條件判斷,文中的示例代碼講解詳細,對我們學習Python有一定幫助,需要的可以參考一下
    2022-03-03
  • Python程序設計入門(5)類的使用簡介

    Python程序設計入門(5)類的使用簡介

    這篇文章主要介紹了Python類的使用,需要的朋友可以參考下
    2014-06-06

最新評論