国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

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

2020-01-04 14:51:05
字體:
來源:轉載
供稿:網友

中間件介紹

中間件顧名思義,是介于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',]

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

中間件順序

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

Django,中間件,middleware

也就是說,每一個請求都是先通過中間件中的 process_request 函數,這個函數返回 None 或者 HttpResponse 對象,如果返回前者,繼續處理其它中間件,如果返回一個 HttpResponse,就處理中止,返回到網頁上。 
中間件不用繼承自任何類(可以繼承 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

例如,比如我們要做一個 流量統計

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

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

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

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

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

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

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

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

import sysfrom django.views.debug import technical_500_responsefrom django.conf import settingsclass 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官方文檔以及網絡上的一些教程,這里也非常感謝這些前輩的分享。

總結

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


注:相關教程知識閱讀請移步到python教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 分宜县| 汾阳市| 镶黄旗| 广宗县| 高碑店市| 沭阳县| 乃东县| 泽州县| 伊春市| 云南省| 江孜县| 波密县| 额尔古纳市| 东阳市| 青岛市| 闵行区| 大港区| 岑巩县| 定南县| 澎湖县| 云南省| 凌海市| 奉化市| 岑溪市| 静宁县| 石楼县| 静乐县| 绥棱县| 开化县| 福清市| 洞口县| 赤壁市| 永城市| 治县。| 怀远县| 东兰县| 东兰县| 会同县| 确山县| 五莲县| 浠水县|