处理request.body超时异常

时间:2016-04-03 13:25:45

标签: python django heroku

我使用request.body从jQuery获取AJAX请求数据到我的django应用程序,但有时request.body会导致Dyno超时,我猜它是因为用户丢弃连接和django等待用户的请求,异常如下所示:

File "/app/myapp/views.py", line 271, in proccess_api
File "/app/.heroku/python/lib/python2.7/site-packages/django/http/request.py", line 233, in body
File "/app/.heroku/python/lib/python2.7/site-packages/django/http/request.py", line 292, in read
File "/app/.heroku/python/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 51, in read
File "/app/.heroku/python/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 45, in _read_limited
File "/app/.heroku/python/lib/python2.7/site-packages/newrelic-2.60.0.46/newrelic/api/web_transaction.py", line 780, in read
File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/http/body.py", line 212, in read
File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/http/body.py", line 128, in read
File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/http/unreader.py", line 38, in read
File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/http/unreader.py", line 65, in chunk
File "/app/.heroku/python/lib/python2.7/site-packages/gunicorn/workers/base.py", line 176, in handle_abort

proccess_api中的行:

req_data = json.loads(request.body)

我在Heroku上使用Django 1.8.11,使用newrelic记录异常。

我的问题是:

  • 如何处理此异常?
  • 是否可以为request.body设置超时,以便请求不会阻止枪支工作人员?

2 个答案:

答案 0 :(得分:0)

我们没有太多关于您的信息,但根据您发布的内容...

"如何处理此异常?" req_data = json.loads(request.body)包裹在try / except中,如下所示:

try:
    req_data = json.loads(request.body)
except:
    # Handle how you like
    # Maybe return a response 404 or 500?

如果您能告诉except要注意哪些特殊例外情况,情况会更好:

try:
    req_data = json.loads(request.body)
except ValueError:
    # Handle value errors
except TypeError:
    # Handle type errors

如果没有完整的错误输出(File ...之后的所有内容)告诉我们Python抛出的确切错误,很难说更多。有关错误处理的更多信息here

"是否可以为request.body设置超时,以便请求不会阻止枪支工作人员?"

我认为这不是超时问题。很明显,链接到该视图的网址会获得某种request并尝试阅读其body。根据您提供给我们的错误输出,read模块中的request会引发错误。 那是为什么你的代码停止了。 request主体不可读的事实意味着您应该将其包裹在try / except中,如上所述。

此外,我帮助您的调整是:req_data = json.loads(request.body.read())

答案 1 :(得分:0)

看起来这是design limitation in gunicorn

  

Gunicorn旨在用于缓冲反向代理

     

Gunicorn默认使用预分叉过程模型。这意味着   网络请求被传递给工作进程池,并且   这些工人流程负责阅读和写作   对客户端的整个HTTP请求。如果客户端具有快速网络   连接,整个请求/响应周期只需要一小部分   第二。但是,如果客户很慢(或故意行为不端),   请求可能需要更长时间才能完成。