使用裝飾器繞過中介軟體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...