Tornado重定向實現&POST方法如何重定向

問題現象:

場景:終端使用POST方法訪問/qacenter/v1/test-records接口時,需要重定向跳轉到/qacenterinner/v1/test-records接口

實現
tornado代碼

    # 增
    async def post(self):
        return self.redirect("/qacenterinner/v1/test-reports", status=307)

使用POSTMAN訪問接口,報錯405 method not allowed, 查看tornado打印如下:

[I 200506 09:34:54 web:2246] 302 POST /qacenter/v1/test-records (192.168.63.56) 0.71ms
[W 200506 09:34:54 web:2246] 405 GET /qacenterinner/v1/test-records (192.168.63.56) 0.49ms

問題描述
使用Tornado 重定向後,發現POSTMAN的請求方法發生了變化,從POST變成了GET
Tornado 重定向使用方法: https://www.tornadoweb.org/en/latest/web.html?highlight=redirect#tornado.web.RequestHandler.redirect

問題分析:

POSTMAN發送請求時,有以下設置,嘗試打開Follow original HTTP Method,這樣重定向後的請求方法就不會發生變化了。
在這裏插入圖片描述
更改後,發現,第二次的請求方法確實變成了POST,但是很遺憾的時,請求body爲空。

這當然時不符合我們的預期的!那到底是什麼原因導致的呢?以及如何解決呢?

問題分析:

實際上,tornado的redirect方法默認返回的是302狀態碼,而在標準HTTP 1.1協議中,有以下約定
在這裏插入圖片描述
所以,不論是瀏覽器、postman還是python 中的requests,都會在302重定向之後請求方法變成了get。

解決辦法:

修改服務端響應碼爲307或308即可,在tornado中指定響應status,修改如下:

    async def post(self):
        return self.redirect("/qacenterinner/v1/test-records", status=307)

修改後,驗證問題解決。

[I 200506 09:44:23 web:2246] 307 POST /qacenter/v1/test-records (192.168.63.56) 0.65ms
[I 200506 09:44:23 web:2246] 201 POST /qacenterinner/v1/test-records (192.168.63.56) 62.78ms

參考資料:
How can tornado set_status 307
MDN web docs: HTTP 的重定向

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章