对于一个请求,我需要在将响应发送到客户端之后执行一个函数。因为该函数很耗时,最终导致连接超时Socket error: [Errno 32] Broken pipe
在Flask中有没有办法在返回请求后执行函数
发布于 2018-06-26 00:02:50
比flask迭代器解决方案更通用的解决方案是编写一个向response close方法添加回调的WSGI中间件。这里我们使用werkzeug ClosingIterator助手和flask应用程序扩展来实现这一点:
import traceback
from werkzeug.wsgi import ClosingIterator
class AfterResponse:
def __init__(self, app=None):
self.callbacks = []
if app:
self.init_app(app)
def __call__(self, callback):
self.callbacks.append(callback)
return callback
def init_app(self, app):
# install extension
app.after_response = self
# install middleware
app.wsgi_app = AfterResponseMiddleware(app.wsgi_app, self)
def flush(self):
for fn in self.callbacks:
try:
fn()
except Exception:
traceback.print_exc()
class AfterResponseMiddleware:
def __init__(self, application, after_response_ext):
self.application = application
self.after_response_ext = after_response_ext
def __call__(self, environ, after_response):
iterator = self.application(environ, after_response)
try:
return ClosingIterator(iterator, [self.after_response_ext.flush])
except Exception:
traceback.print_exc()
return iterator
然后,您可以像这样使用after_response
装饰器:
import flask
import time
app = flask.Flask("after_response")
AfterResponse(app)
@app.after_response
def after():
time.sleep(2)
print("after_response")
@app.route("/")
def home():
return "Success!\n"
当你卷曲它时,你会看到它立即响应,curl关闭,然后2秒后你的"after“消息出现在日志中:
127.0.0.1 - - [25/Jun/2018 15:41:51] "GET / HTTP/1.1" 200 -
after_response
https://stackoverflow.com/questions/18082683
复制相似问题