我有一个每日cron,它可以处理我应用程序中的一些循环事件,并且我不时注意到在日志中弹出一个奇怪的错误。除此之外,cron还对一些代码进行了验证,并且它使用运行在同一服务器上的webapp,因此验证请求通过POST
请求获得一些数据。使用GET代替POST请求的python-requests
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( '/验证/',方法= [ '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。
我发现了类似的东西here,但有人说,有一个从HTTP重定向到HTTPS版本,并且我也有重定向存在于服务器中,但是请求所在的URL有HTTPS ,所以我怀疑这是事业。
我正在运行的这个堆栈是uwsgi
+ nginx
+ flask
。任何人都可以看到可能造成这种情况?重复一次,它不会总是发生,所以有时它的工作如预期,有时不会。我最近从apache
和mod_wsgi
迁移到这个新的堆栈,从那时起,我已经开始传递这个错误;不能回想起在apache
环境中看到它。
谢谢!
感谢您的回复。我用这个标志修改了我的应用程序中的调用,并添加了一些调试信息以查看是什么导致了这种情况。 –
我知道这似乎令人烦恼,但我想向您保证,我们正在做的是目前处理重定向的最佳做法。请求中发生的事情是为了您的安全。 –