Django 之 中介軟體

2021-10-03 21:31:24 字數 3900 閱讀 4976

使用裝飾器繞過中介軟體csrf_token

從全域性角度改變 django 框架的輸入和輸出

不宜過多

不宜太複雜

middleware =

[# 模組名為 mymiddlewares, 類名為 md1

'mymiddlewares.md1'

,]

from django.utils.deprecation import middlewaremixin

class

md1(middlewaremixin)

:def

process_request

(self, request)

:"""

執行檢視函式前執行, 按照 settings 中註冊順序執行

:param request: 和請求物件中的 request 是同乙個

:return: 預設返回 none; 可手動返回響應, 返回響應則不執行檢視函式

"""print

("md1 中 process_request 方法"

)def

process_response

(self, request, response)

:"""

執行檢視函式之後, 按照註冊順序的倒序執行

:param request:

:param response:

:return: 必須返回響應物件

返回預設的 response

返回新生成的 response

"""print

("md1 中的 process_response 方法"

)return response

defprocess_view

(self, request, view_func, view_args, view_kwargs)

:"""

檢視函式之前, urls.py找到將要執行的檢視函式之後, 按照註冊順序執行

:param request:

:param view_func: 即將執行的檢視函式資訊

:param view_args: 函式內的引數

:param view_kwargs: 函式內的引數

:return:

"""print

(view_func.__name__)

print

("md1 中的 process_view 方法"

)def

process_exception

(self, request, exception)

:"""

丟擲異常時執行, 返回響應物件就跳出, 繼續執行 process_response 方法, 按照註冊倒序執行

:param request:

:param exception: 丟擲的異常

:return: 必須要返回乙個 response, 頁面會飄黃

"""print

("md1 中的 process_exception 方法"

"檢視函式報錯了, {}"

.format

(exception)

)def

process_template_response

(self, request, response)

:"""

檢視函式之後, 返回響應的物件要有 render 方法, 按照註冊的倒序執行

:param request:

:param response:

:return: 對傳遞過來的響應物件, 呼叫其 render 方法, 把返回值向後繼續傳遞

"""print

("md1 中的 process_template_response 方法"

)return response

from django.utils.deprecation import middlewaremixin

d =class

astrict

(middlewaremixin)

:# 需要在 settings 中註冊

""" 限制訪問頻率, 10 秒內只允許訪問 3 次

"""defprocess_request

(self, request)

:# 拿到訪問 ip

ip = request.meta.get(

"remote_addr"

)# 如果第一次訪問, 建立乙個格式的資料

if ip not

in d:

d[ip]=[

] now = time.time(

) history = d[ip]

# 當 history 列表存在, 並且如果訪問時間超過 10 秒, 將最舊時間剔除

while history and now - history[-1

]>10:

history.pop(

)# 執行完上邊的操作後, 如果列表中資料仍然大於等於 3, 表示限制時間內, 超出訪問次數

:# 否則將當前時間插入到列表的第一位

history.insert(

0, now)

# fbv 繞過csrf_token

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt

deffunc

(request)

:pass

# cbv 繞過csrf_token

from django.views.decorators.csrf import csrf_exempt

from django.utils.decorators import method_decorator

# 方法 1

@method_decorator(csrf_exempt, name=

'dispatch'

)class

c1(views.view)

:def

get(self)

:pass

defpost

(self)

:pass

# 方法 2

class

c1(views.view)

: @method_decorator(csrf_exempt)

defdispatch

(self, request,

*args,

**kwargs)

:return

super

(asset, self)

.dispatch(request,

*args,

**kwargs)

defget

(self)

:pass

defpost

(self)

:pass

# 需要提前安裝 djangorestframework, pip install djangorestframework

from rest_framework.views import apiview

class

c2(views.view)

:def

get(self)

:pass

defpost

(self)

:pass

Django之中介軟體

django中的中介軟體 middleware 在django中,中介軟體其實就是乙個類,在請求到來和結束後,django會根據自己的規則在合適的時機執行中介軟體中相應的方法。在django專案的settings模組中,有乙個middleware classes變數,其中每乙個元素就是乙個中介軟體 ...

django之中介軟體

1 什麼是中介軟體 顧名思義中介軟體就是介於request和response處理之間的一道處理過程,相對比較輕量級,並且在全域性上改變django的輸入和輸出。因為改變的是全域性,所以需要謹慎使用,用不好反而會影響效能。如果你想修改請求,例如被傳送到view中的httprequest物件。或者你想修...

Django學習之中介軟體

1 概念 中介軟體,是介於request與response處理之間的一道處理過程,相對比較輕量級,並且在全域性上改變django的輸入 與輸出。因為改變的是全域性,所以需要謹慎實用,用不好會影響到效能。比如你想修改請求,例如被傳送到view中的httprequest物件,或者修改view返回的htt...