gpt4 book ai didi

python - 当客户端过早断开连接时,如何对 Flask 上的破损管道错误进行异常(exception)处理?

转载 作者:太空狗 更新时间:2023-10-29 21:05:35 24 4
gpt4 key购买 nike

我正在使用 flask 进行开发,而不是生产,我有一个 ajax 请求的 View ,如下所示:

@application.route('/xyz/<var>/', methods=['GET'])
def getAjax(var):
...
return render_template(...)

我还在使用 threaded=true 进行开发。每当我调用该 ajax 请求然后关闭请求它的选项卡时,我都会收到错误消息:

Traceback (most recent call last):   File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 593, in process_request_thread
self.finish_request(request, client_address) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 334, in finish_request
self.RequestHandlerClass(request, client_address, self) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 651, in __init__ 2015-07-07 09:46:09,430 127.0.0.1 - - [07/Jul/2015 09:46:09] "GET /xyz/List/ HTTP/1.1" 200 -
self.finish() File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 710, in finish
self.wfile.close() File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 279, in close
self.flush() File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 303, in flush
self._sock.sendall(view[write_offset:write_offset+buffer_size]) error: [Errno 32] Broken pipe

我可以用 try: except block 来捕获这个异常吗?我尝试将所有 getAjax 函数的内容放在:

try:
...
except socket.error, e:
logging.warn("socket error " + e)

但是它不起作用,我应该在哪里做这个?或者如何?

编辑:添加ajax调用

$.ajax({
type: 'GET',
url: '/xyz/' + var + '/',
data: {
...
},
timeout: 2000,
success: function(data) {
...
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
...
}
});

最佳答案

您遇到的问题是,通过使用 Flask,您无法控制整个服务器堆栈,因此您无法捕获应用程序代码之外出现的错误。 socket.error 实际上在 Flask 的内置开发服务器中传播(它可能只是 SocketServer 的包装器,我不知道细节),并且因为它只是一个不用于生产的开发服务器,它不处理客户突然死亡的情况。

通常,这应该无关紧要。如果您实际使用 Gunicorn 或其他工具部署您的代码,那么 WSGI 容器将处理损坏的管道,而无需您提供任何信息。您可以通过在这样的容器中本地运行您的代码来对此进行测试——尝试在您的计算机上安装 Gunicorn 并查看当您的应用程序代码在其包装器中运行时会发生什么。

如果您仍然遇到问题,那么事情可能会变得复杂,因为问题可能出现在许多不同的地方。 Gevent just got to handling this particular error ,因此,如果您使用的是鲜为人知的 WSGI 容器,那么它也可能无法处理此错误。或者它可能是他们正在使用的无法处理此问题的东西。

一般来说,如果您以标准方式使用网络框架,则不必自己处理低级服务器错误。这就是您使用网络框架的原因首先。如果您正在尝试推出自己的视频流或其他东西,那完全是另一回事,但这里似乎不是这种情况。

关于python - 当客户端过早断开连接时,如何对 Flask 上的破损管道错误进行异常(exception)处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31265050/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com