2015-04-06 80 views
2

我有一个每日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。任何人都可以看到可能造成这种情况?重复一次,它不会总是发生,所以有时它的工作如预期,有时不会。我最近从apachemod_wsgi迁移到这个新的堆栈,从那时起,我已经开始传递这个错误;不能回想起在apache环境中看到它。

谢谢!

回答

2

当我们处理重定向时,我们唯一一次将POST请求更改为GET。根据重定向代码,我们将更改请求方法。如果您想确定我们不遵循重定向,则需要通过allow_redirects=False。也就是说,您需要弄清楚为什么您的应用程序正在生成重定向(包括重定向到HTTP或到其他域,或使用特定的状态码)。

+0

感谢您的回复。我用这个标志修改了我的应用程序中的调用,并添加了一些调试信息以查看是什么导致了这种情况。 –

+0

我知道这似乎令人烦恼,但我想向您保证,我们正在做的是目前处理重定向的最佳做法。请求中发生的事情是为了您的安全。 –