python请求生成GET而不是POST请求

python请求生成GET而不是POST请求,python,nginx,python-requests,uwsgi,http-status-code-405,Python,Nginx,Python Requests,Uwsgi,Http Status Code 405,我每天都有一个cron来处理我应用程序中的一些重复事件,我不时会注意到日志中弹出一个奇怪的错误。cron对一些代码进行验证,并使用在同一台服务器上运行的webapp,因此验证请求是通过POSTrequest和一些数据发出的 url = 'https://example.com/validate/' payload = {'pin': pin, 'sku': sku, 'phone': phone, 'AR': True} validation_post = requests.post(url,

我每天都有一个cron来处理我应用程序中的一些重复事件,我不时会注意到日志中弹出一个奇怪的错误。cron对一些代码进行验证,并使用在同一台服务器上运行的webapp,因此验证请求是通过
POST
request和一些数据发出的

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>
应用程序的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/',方法=['POST']) @需要登录

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
块中有一些
返回
,但即使这些返回失败或有一个表达式,也没有任何东西可以在该块中引发
405
错误代码,只有
403
这是很少发生的,因为我从cron手动构造并登录用户

我发现了类似的事情,但问题是有一个从HTTP到HTTPS版本的重定向,我在服务器中也有这个重定向,但是请求的URL中有HTTPS,所以我怀疑这是原因

我正在运行此操作的堆栈是
uwsgi
+
nginx
+
flask
。有人知道是什么原因造成的吗?重复一次,它并不总是发生,所以有时它能按预期工作,有时不能。我最近从
apache
mod_wsgi
迁移到这个新堆栈,从那时起,我开始输入这个错误;无法在
apache
环境中重新调用它


谢谢

我们将
POST
请求更改为
GET
的唯一时间是在处理重定向时。根据重定向代码,我们将更改请求方法。如果您想确保我们不遵循重定向,您需要传递
allow\u redirects=False
。也就是说,您需要找出应用程序生成重定向的原因(包括是否重定向到HTTP或其他域,或者是否使用特定的状态码)。

感谢您的回复。我已使用此标志修改了我的应用程序中的呼叫,并添加了一些调试信息,以尝试查看导致此情况的原因。我知道发生这种情况似乎很烦人,但我想向您保证,我们所做的是当前处理重定向的最佳做法。请求中发生的事情是为了您的安全。
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)