<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                >[success] # Django 中間件 ~~~ 所有的請求,先到中間插件過濾,過濾后進行url匹配,到對應的view方法,response返回給中間插件,中間插件層層返回給用戶。根據這個描述我們可以畫個圖 ~~~ ![](https://box.kancloud.cn/0941286c3eac854b1c38adf6b50c8b62_583x309.png) * setting 中的圖 ![](https://box.kancloud.cn/2e65d9d1a5839f1b4b124408b5b4924c_643x283.png) >[success] # 如何配置 >[danger] ##### 創建目錄 ![](https://box.kancloud.cn/73f948016c8d31c6eeb9f60a18b0e16d_250x111.png) * * * * * <br> >[danger] ##### 導入中間件 ![](https://box.kancloud.cn/6ef3dcc174ceeb3d95befac736166a21_591x260.png) >[danger] ##### 編寫中間件 ~~~ 1.知識點from django.utils.deprecation import MiddlewareMixin繼承類 2.接受請求的方法名process_request() 3.返回響應的方法名process_response() 4.參數reuqest等同于view中的request ~~~ * 代碼案例 ~~~ from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse class test1(MiddlewareMixin): def process_request(self,request): print("1號請求") def process_response(self,request,response): print("1號響應") return response class test2(MiddlewareMixin): def process_request(self, request): print("2號請求") def process_response(self, request, response): print("2號響應") return response ~~~ * 打印結果 ~~~ 1號請求 2號請求 view響應 2號響應 1號響應 ~~~ >[danger] ##### 發現條件不滿足時 ![](https://box.kancloud.cn/26899d37b3683b877ba7ff07243f1083_603x287.png) 當第一個過濾器發現已經不滿足,過濾篩選項時,可以利用HttpResponse,直接不經過views層 ~~~ from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse class first(MiddlewareMixin): def process_request(self,request): print(request.META['REMOTE_ADDR']) return HttpResponse('你沒有權限') def process_response(self,request,response): print("1號響應") return response ~~~ >[success] # 參數流程 >[danger] ##### 統計模板運行時間 func 代指運行函數 ~~~ from django.utils.deprecation import MiddlewareMixin from django.urls import reverse class TimeItMiddleware(MiddlewareMixin): def process_request(self, request): return def process_view(self, request, func, *args, **kwargs): if request.path != reverse('index'): return None start = time.time() response = func(request) costed = time.time() - start print('{:.2f}s'.format(costed)) return response def process_exception(self, request, exception): pass def process_template_response(self, request, response): return response def process_response(self, request, response): return response ~~~ >[danger] ##### process_request ~~~ 一個請求來到middelware層,進入的第一個方法。一般情況我們可以在這里做一 些校驗,比如用戶登錄,或者HTTP中是否有認證頭之類的驗證。這個方法需要兩 種返回值,HttpResponse或者None,如果返回HttpResponse,那么接下來的 處理方法只會執行process_response,其他的方法將不會被執行。這里需要注意 的是,如果你的middleware在settings配置的MIDDLEWARE_CLASS的第一個的 話,那么剩下的middleware也不會被執行。另外一個返回值是None,如果返回 None,那么Django會繼續執行其他的方法。 ~~~ >[danger] ##### process_view ~~~ 這個方法是在process_request之后執行的,參數如上面代碼所示,其中的func 就是我們將要執行的view方法,因此我們要統計一個view的執行時間,可以在這 里來做。它的返回值跟process_request一樣,HttpResponse/None,邏輯也是 一樣。如果返回None,那么Django會幫你執行view函數,從而得到最終的 Response。 ~~~ >[danger] ##### process_template_response ~~~ 執行完上面的方法,并且Django幫忙我們執行完view之后,拿到最終的 response,如果是使用了模板的Response(是指通過return render(request, 'index.html', context={})的方式返回Response,就會來到這個方法中。這個方 法中我們可以對response做一下操作,比如Content-Type設置,或者其他 HEADER的修改/增加。 ~~~ >[danger] ##### process_response ~~~ 當所有流程都處理完畢,就來到了這個方法,這個方法的邏輯跟 process_template_response是完全一樣的。只是process_template_response 是針對帶有模板的response的處理。 ~~~ >[danger] ##### process_exception ~~~ 上面的所有處理方法是按順序介紹的,而這個不太一樣。只有在發生異常時,才 會進入到這個方法。哪個階段發生的異常呢?可以簡單的理解為在將要調用的 view中出現異常(就是在process_view的func函數中)或者返回的模板 Response在render時發生的異常,會進入到這個方法中。但是需要注意的是, 如果你在process_view中手動調用了func,就像我們上面做的那樣,那就不會觸 發process_exception了。這個方法接收到異常之后,可以選擇處理異常,然后 返回一個含有異常信息的HttpResponse,或者直接返回None,不處理,這種情 況Django會使用自己的異常模板。 ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看