[Python] [Django] [Django將post請求變成get的奇妙冒險]
通過requests庫向Django后台服務器發送post請求,請求url如下
http://10.16.195.51:8000/hsvltnprjct/shutdown
請求方法如下
import requests
url = "http://10.16.195.51:8000/hsvltnprjct/shutdown"
data = {"task_id":"24123-234123-4124312"}
headers = {"Content-Type":"application/json"}
requests.post(url=url, headers=headers, data=data)
在服務端一直走get請求邏輯,於是我嘗試通過中間件來判斷,請求方式
在中間件最上方加一個中間件,打印request.META,發現會收到兩個請求,一個post,一個get。
然后將中間件方法放在中間件最后,發現只會收到一個get請求。
說明django服務最開始確實收到了post請求,只不過在中間被重定向為get請求了。
查閱了一系列完整,發現了django的一個小細節,在url定向的時候,如果末尾不是‘/’,會被系統重定向到帶‘/’的url,即301,然后空的請求被重定向,就變成了get。
比如本來是’/sudoku/‘結果我的目標是’/sudoku’,這就會出問題
如果還有問題的話 加上裝飾器 @csrf_exempt
django中也有這一點的配置,APPEND_SLASH
django默認地會將APPEND_SLASH設置為True,也就是任何不匹配或尾部沒有斜杠(/)的申請URL,將被重定向至尾部包含斜杠的相同字眼的URL。
當 seetings.py 設置為 APPEND_SLASH = False 時,訪問 http://example.com/hello 將會返回 404。
所以我覺得還是按照官方默認開啟這個參數方便些,如果不想要后面的 / ,可以在 urls.py 定義成 '^hello$' 這樣的形式。