django redirect传递参数_Django中间件
一、什么是中間件
中間件,是介于request與response處理之間的一道處理過程,相對(duì)比較輕量級(jí),并且在全局上改變django的輸入與輸出。因?yàn)楦淖兊氖侨?#xff0c;所以需要謹(jǐn)慎實(shí)用,用不好會(huì)影響到性能。
django中間價(jià)官網(wǎng)定義:
Middleware is a framework of hooks into Django’s request/response processing.
It’s a light, low-level “plugin” system for globally altering Django’s input or output.
二、中間件有什么作用
如果你想修改請(qǐng)求。
例如被傳送到view中的HttpRequest對(duì)象。 或者你想修改view返回的HttpResponse對(duì)象,這些都可以通過中間件來實(shí)現(xiàn)。
可能你還想在view執(zhí)行之前做一些操作,這種情況就可以用 middleware來實(shí)現(xiàn)。
Django默認(rèn)的中間件:(在django項(xiàng)目的settings模塊中,有一個(gè) MIDDLEWARE變量,其中每一個(gè)元素就是一個(gè)中間件,如下圖)
請(qǐng)求進(jìn)來是自上而下,通過反射找到類,用for循環(huán)來執(zhí)行。
可以自定義中間件,但是也要寫在MIDDLEWARE中,可以在app01下創(chuàng)建一個(gè)mymid.py文件來寫我們自定義的中間件
每一個(gè)中間件都有具體的功能.
三、自定義中間件
中間件可以定義五個(gè)方法,分別是:(主要的是process_request和process_response)
1、process_request(self,request)2、process_view(self, request, callback, callback_args, callback_kwargs)3、process_template_response(self,request,response)4、process_exception(self, request, exception)5、process_response(self, request, response)以上方法的返回值可以是None或一個(gè)HttpResponse對(duì)象,如果是None,則繼續(xù)按照django定義的規(guī)則向后繼續(xù)執(zhí)行,如果是HttpResponse對(duì)象,則直接將該對(duì)象返回給用戶。
1、process_request和process_response
當(dāng)用戶發(fā)起請(qǐng)求的時(shí)候會(huì)依次經(jīng)過所有的的中間件,這個(gè)時(shí)候的請(qǐng)求時(shí)process_request,最后到達(dá)views的函數(shù)中,views函數(shù)處理后,在依次穿過中間件,這個(gè)時(shí)候是process_response,最后返回給請(qǐng)求者。
上述截圖中的中間件都是django中的,我們也可以自己定義一個(gè)中間件,我們可以自己寫一個(gè)類,但是必須繼承MiddlewareMixin。
2、process_view
process_view(self, request, view_func, view_args, view_kwargs)
該方法有四個(gè)參數(shù):
request是HttpRequest對(duì)象。
view_func是Django即將使用的視圖函數(shù)。 (它是實(shí)際的函數(shù)對(duì)象,而不是函數(shù)的名稱作為字符串。)
view_args是將傳遞給視圖的位置參數(shù)的列表(無名分組分過來的值).
view_kwargs是將傳遞給視圖的關(guān)鍵字參數(shù)的字典(有名分組分過來的值)。 view_args和view_kwargs都不包含第一個(gè)視圖參數(shù)(request)。
Django會(huì)在調(diào)用視圖函數(shù)之前調(diào)用process_view方法。
它應(yīng)該返回None或一個(gè)HttpResponse對(duì)象。 如果返回None,Django將繼續(xù)處理這個(gè)請(qǐng)求,執(zhí)行任何其他中間件的process_view方法,然后在執(zhí)行相應(yīng)的視圖。 如果它返回一個(gè)HttpResponse對(duì)象,Django不會(huì)調(diào)用適當(dāng)?shù)囊晥D函數(shù)。 它將執(zhí)行中間件的process_response方法并將應(yīng)用到該HttpResponse并返回結(jié)果。
3、process_exception
process_exception(self, request, exception)
該方法兩個(gè)參數(shù):
一個(gè)HttpRequest對(duì)象
一個(gè)exception是視圖函數(shù)異常產(chǎn)生的Exception對(duì)象。
這個(gè)方法只有在視圖函數(shù)中出現(xiàn)異常了才執(zhí)行,它返回的值可以是一個(gè)None也可以是一個(gè)HttpResponse對(duì)象。如果是HttpResponse對(duì)象,Django將調(diào)用模板和中間件中的process_response方法,并返回給瀏覽器,否則將默認(rèn)處理異常。如果返回一個(gè)None,則交給下一個(gè)中間件的process_exception方法來處理異常。它的執(zhí)行順序也是按照中間件注冊(cè)順序的倒序執(zhí)行。
4、process_template_response(self,request,response)
該方法對(duì)視圖函數(shù)返回值有要求,必須是一個(gè)含有render方法類的對(duì)象,才會(huì)執(zhí)行此方法。
如何自定義中間件?
自定義中間件的模板
def根據(jù)代碼:需要定義一個(gè)中間件的工廠函數(shù) simple_middleware,然后返回一個(gè)可以被調(diào)用的中間件 middleware
中間件工廠函數(shù) simple_middleware 需要接收一個(gè)可以調(diào)用的 get_response 對(duì)象
返回的中間件也是一個(gè)可以被調(diào)用的對(duì)象,并且像視圖一樣需要接收一個(gè)request對(duì)象參數(shù),返回一個(gè)response對(duì)象。
例如:在一個(gè)模塊中新建一個(gè)middleware.py文件
在文件中寫入以下代碼:
定義好中間件后,需要在settings.py 文件中添加注冊(cè)中間件
定義一個(gè)視圖進(jìn)行測(cè)試
四、中間件應(yīng)用場(chǎng)景
1、做IP訪問頻率限制
某些IP訪問服務(wù)器的頻率過高,進(jìn)行攔截,比如限制每分鐘不能超過20次。
2、URL訪問過濾
如果用戶訪問的是login視圖(放過)
如果訪問其他視圖,需要檢測(cè)是不是有session認(rèn)證,已經(jīng)有了放行,沒有返回login,這樣就省得在多個(gè)視圖函數(shù)上寫裝飾器了!
3、緩存(還記得CDN嗎?)
客戶端請(qǐng)求來了,中間件去緩存看看有沒有數(shù)據(jù),有直接返回給用戶,沒有再去邏輯層 執(zhí)行視圖函數(shù)
總結(jié)
以上是生活随笔為你收集整理的django redirect传递参数_Django中间件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 全志科技公司A83T Qt 支持双屏显示
- 下一篇: 整合营销推广该如何做?