我使用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
设置超时,以便请求不会阻止枪支工作人员?答案 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请求。如果客户端具有快速网络 连接,整个请求/响应周期只需要一小部分 第二。但是,如果客户很慢(或故意行为不端), 请求可能需要更长时间才能完成。