8

我像这样运行一个简单的烧瓶应用程序:

from flask import Flask

app = Flask(__name__) 

@app.route('/')
def welcome():
    return "OK"


app.config.update(
    DEBUG = True
)

if __name__ == '__main__':
    app.run(use_reloader = False)

当我运行它并访问它时,有时(并非总是)它无法响应请求并抛出异常:

Exception happened during processing of request from ('127.0.0.1', 54481)
Traceback (most recent call last):
  File "c:\python27\Lib\SocketServer.py", line 295, in _handle_request_noblock
    self.process_request(request, client_address)
  File "c:\python27\Lib\SocketServer.py", line 321, in process_request
    self.finish_request(request, client_address)
  File "c:\python27\Lib\SocketServer.py", line 334, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "c:\python27\Lib\SocketServer.py", line 651, in __init__
    self.finish()
  File "c:\python27\Lib\SocketServer.py", line 710, in finish
    self.wfile.close()
  File "c:\python27\Lib\socket.py", line 279, in close
    self.flush()
  File "c:\python27\Lib\socket.py", line 303, in flush
    self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 10053]

我不明白是什么导致了这个故障?我该如何解决?

我怎样才能try except抓住它?

4

3 回答 3

11

我最近在尝试使用 Flask 提供音频文件时遇到了此错误消息。每当客户端在流结束之前关闭流时,我都会收到此错误消息。

此错误消息并非源自您的 Flask 应用程序,而是源自用于分派请求数据的底层 SocketServer。正在发生的事情是与客户端的连接由于某种原因而结束,但 Flask 继续尝试将数据写入关闭的套接字。您无法从 Flask 应用程序中捕获此异常,因为 Flask 会为您捕获它。Flask 将其作为服务打印出来,通知您流已过早关闭,即在 Flask 完成将数据写入流之前。

总结一下,这个错误信息是 Flask 内部的,Flask 打印它是为了告诉你在连接关闭之前它不能把所有的数据都拿到客户端。你抓不到它,你也不应该有任何理由去抓它。

于 2013-09-24T22:18:12.280 回答
0

我发现这个解决方案至少是一个很好的临时解决方案。

if __name__ == '__main__':
  while True:
    try:
       app.run(use_reloader = False)
    except:
      pass

您可以添加自己的退出逻辑,或者使用发送 SIGQUIT 的 CTRL + \ 离开程序。(如果您正在运行螺纹烧瓶,这很重要)

但是,您不能:

   except KeyboardInterupt:

因为 Flask 已经捕获了 KeyboardInterupt 异常并处理了它们。

错误10052表示你使用的是windows,据我所知,关闭命令窗口退出程序

于 2016-09-21T00:12:48.487 回答
-3

通过查看您的错误消息,这可能是由于使用的端口号为 54481。它可能与其他东西发生冲突。我还建议不要使用 use_reloader 参数,因为您的 DEBUG 已经设置为 False。所以烧瓶不会重新加载任何代码更改。你可以这样做吗:

if __name__ == '__main__':
    app.run(port=5000)
于 2013-07-22T13:02:53.450 回答