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

首頁 > 編程 > Python > 正文

Django中間件工作流程及寫法實例代碼

2020-02-22 23:08:08
字體:
來源:轉載
供稿:網友

熟悉web開發的同學對hook鉤子肯定不陌生,通過鉤子可以方便的實現一些觸發和回調,并且做一些過濾和攔截。

django中的中間件(middleware)就是類似鉤子的一種存在。下面我們來介紹一下,并且給出一些實例。

1、Middleware的工作流程

我盜了一個圖,看網上很多人用這個圖,來源已經追不明白了。簡單聲明一下,這個圖不是我的。看著圖我們分析一下:

1)django的請求相應流程:HttpRequest -> RequestMiddleware -> view function -> ResponseMiddleware -> HttpResponse

可以看到一個請求到響應的過程,中間夾著兩個middleware流程,請求中間件和響應中間件。

也就是說,django提供了一種機制,在:

    請求到達視圖函數中間 視圖函數到響應之間

支持嵌入鉤子。

這種鉤子的特點:

    全局,一旦你使用了中間件,并且發布生效的話,所有的請求都會經過你嵌入的中間件。 性能敏感,如果你的中間件性能差的話,那么會影響服務的整體性能。

2) django的middleware包含四個鉤子函數:process_request/process_view/process_response/process_exception

process_request:接受request之后確定所執行的view之前

process_view:確定了所要執行的view之后,view真正執行之前

process_response:view執行之后

process_exceptionview:view執行拋出異常

而插入middleware的過程是在settings.py中配置,如下默認配置,我只截取了兩個中間件:SessionMiddleware和CommonMiddleware。

MIDDLEWARE_CLASSES = (  'django.contrib.sessions.middleware.SessionMiddleware',  'django.middleware.common.CommonMiddleware',    ...    )

我們簡單看一下SessionMiddleware的實現

import timefrom importlib import import_modulefrom django.conf import settingsfrom django.utils.cache import patch_vary_headersfrom django.utils.http import cookie_dateclass SessionMiddleware(object):  def __init__(self):    engine = import_module(settings.SESSION_ENGINE)    self.SessionStore = engine.SessionStore  def process_request(self, request):    session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME, None)    request.session = self.SessionStore(session_key)  def process_response(self, request, response):    """    If request.session was modified, or if the configuration is to save the    session every time, save the changes and set a session cookie or delete    the session cookie if the session has been emptied.    """    try:      accessed = request.session.accessed      modified = request.session.modified      empty = request.session.is_empty()    except AttributeError:      pass    else:      # First check if we need to delete this cookie.      # The session should be deleted only if the session is entirely empty      if settings.SESSION_COOKIE_NAME in request.COOKIES and empty:        response.delete_cookie(settings.SESSION_COOKIE_NAME)      else:        if accessed:          patch_vary_headers(response, ('Cookie',))        if modified or settings.SESSION_SAVE_EVERY_REQUEST:          if request.session.get_expire_at_browser_close():            max_age = None            expires = None          else:            max_age = request.session.get_expiry_age()            expires_time = time.time() + max_age            expires = cookie_date(expires_time)          # Save the session data and refresh the client cookie.          # Skip session save for 500 responses, refs #3881.          if response.status_code != 500:            request.session.save()            response.set_cookie(settings.SESSION_COOKIE_NAME,                request.session.session_key, max_age=max_age,                expires=expires, domain=settings.SESSION_COOKIE_DOMAIN,                path=settings.SESSION_COOKIE_PATH,                secure=settings.SESSION_COOKIE_SECURE or None,                httponly=settings.SESSION_COOKIE_HTTPONLY or None)    return response            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 垣曲县| 句容市| 锡林郭勒盟| 灵石县| 邵阳县| 青浦区| 禄劝| 凤山市| 弋阳县| 宜州市| 房产| 临沧市| 武清区| 都兰县| 陆良县| 长丰县| 泾源县| 辽中县| 越西县| 东山县| 龙里县| 五原县| 平舆县| 织金县| 互助| 武乡县| 苍南县| 宁津县| 鲁山县| 乳山市| 甘孜| 泾川县| 昌都县| 临清市| 嘉鱼县| 五华县| 崇义县| 临澧县| 庆元县| 星座| 界首市|