簡體   English   中英

python-requests 發出 GET 而不是 POST 請求

[英]python-requests making a GET instead of POST request

我有一個每天的 cron 來處理我的應用程序中的一些重復事件,並且我不時注意到日志中彈出一個奇怪的錯誤。 cron,除其他外,對一些代碼進行驗證,它使用在同一台服務器上運行的 webapp,因此驗證請求是通過POST請求和一些數據發出的。

url = 'https://example.com/validate/'
payload = {'pin': pin, 'sku': sku, 'phone': phone, 'AR': True}
validation_post = requests.post(url, data=payload)

因此,這發出了實際請求,我記錄了響應。 時不時地,最近達到 50% 的請求,響應包含來自 nginx 的以下消息:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>405 Method Not Allowed</title>
<h1>Method Not Allowed</h1>
<p>The method GET is not allowed for the requested URL.</p>

因此,實際請求是使用GET方法發出的,而不是代碼中指示的POST 在 nginx access.log中,我可以看到該條目:

123.123.123.123 - - [18/Feb/2015:12:26:50 -0500] "GET /validate/ HTTP/1.1" 405 182 "-" "python-requests/2.2.1 CPython/2.7.6 Linux/3.13.0-37-generic"

該應用程序的 uwsgi 日志顯示了類似的內容:

[pid: 6888|app: 0|req: 1589/58763] 123.123.123.123 () {40 vars in 613 bytes} [Mon Apr  6 11:42:41 2015] GET /validate/ => generated 182 bytes in 1 msecs (HTTP/1.1 405) 4 headers in 234 bytes (1 switches on core 0)

因此,一切都表明實際請求不是使用POST發出的。 處理此代碼的應用程序路由很簡單,這是摘錄:@app.route('/validate/', methods=['POST']) @login_required

def validate():
    if isinstance(current_user.user, Sales):
        try:
            #do the stuff here
        except Exception, e:
            app.logger.exception(str(e))
            return 0
    abort(403)

應用程序路由可能會失敗,並且在try塊中有一些returns ,但即使這些失敗或有異常,也沒有什么可以在這個塊中引發405錯誤代碼,只有403自從我構建以來很少發生並且從 cron 手動登錄用戶。

我在這里發現了類似的東西,但問題是存在從 HTTP 到 HTTPS 版本的重定向,而且我在服務器中也有該重定向,但是發出請求的 URL 中包含 HTTPS,所以我懷疑這就是原因。

我運行它的堆棧是uwsgi + nginx + flask 誰能看出是什么原因造成的? 重復一遍,它並不總是發生,所以有時它會按預期工作,有時不會。 我最近從apachemod_wsgi遷移到這個新堆棧,從那時起我開始遇到這個錯誤; 不記得曾經在apache環境中看到過它。

謝謝!

我們只有在處理重定向時才將POST請求更改為GET 根據重定向代碼,我們將更改請求方法。 如果要確保我們不遵循重定向,則需要傳遞allow_redirects=False 也就是說,您需要弄清楚應用程序為什么生成重定向(包括重定向到HTTP或其他域,或使用特定狀態代碼的原因)。

不確定它是否是設計使然,但刪除 URL 末尾的正斜杠為我修復了它:

url = 'https://example.com/validate/'  # remove the slash
payload = {'pin': pin, 'sku': sku, 'phone': phone, 'AR': True}
validation_post = requests.post(url, data=payload)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM