127.0.0.1 - - [08/Aug/2018 19:16:54] "POST /convert HTTP/1.0" 200 -
Error on request:
Traceback (most recent call last):
File "/usr/lib/python2.7/site-packages/werkzeug/serving.py", line 270, in run_wsgi
execute(self.server.app)
File "/usr/lib/python2.7/site-packages/werkzeug/serving.py", line 261, in execute
write(data)
File "/usr/lib/python2.7/site-packages/werkzeug/serving.py", line 227, in write
self.send_header(key, value)
File "/usr/lib64/python2.7/BaseHTTPServer.py", line 401, in send_header
self.wfile.write("%s: %s\r\n" % (keyword, value))
IOError: [Errno 32] Broken pipe
项目中碰到这样的一个问题。google 了一下,解释是因为使用 Flask 原生 WSGI 发布的 web 应用程序,客户端主动断开了与服务器端的连接,而服务器端依然在发送数据到客户端,导致了管道破裂(我是这样理解的)。
WSGI
Web服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。
解决方法有好多个。
- 重写 ThreadingHTTPServer
这个比较麻烦,我也没尝试过,所以这里不阐述了。 - 捕捉 EPIPE 错误
import sys, errno
try:
### IO operation ###
except IOError as e:
if e.errno == errno.EPIPE:
### Handle error ###
- 直接忽略 EPIPE 错误
from signal import signal, SIGPIPE, SIG_DFL
signal(SIGPIPE, SIG_DFL)
- 使用其他的 WSGI
from flask import Flask
import gevent.pywsgi
import gevent
app = Flask(__name__)
@app.route('/')
def handle():
return 'welcome to gevent lesson!'
gevent_server = gevent.pywsgi.WSGIServer(('', 5000), app)
gevent_server.serve_forever()
参考文献: