首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Flask中返回响应后需要执行函数

在Flask中返回响应后需要执行函数
EN

Stack Overflow用户
提问于 2013-08-06 22:15:05
回答 6查看 31.1K关注 0票数 35

对于一个请求,我需要在将响应发送到客户端之后执行一个函数。因为该函数很耗时,最终导致连接超时Socket error: [Errno 32] Broken pipe

Flask中有没有办法在返回请求后执行函数

EN

Stack Overflow用户

发布于 2018-06-26 00:02:50

比flask迭代器解决方案更通用的解决方案是编写一个向response close方法添加回调的WSGI中间件。这里我们使用werkzeug ClosingIterator助手和flask应用程序扩展来实现这一点:

代码语言:javascript
运行
复制
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装饰器:

代码语言:javascript
运行
复制
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“消息出现在日志中:

代码语言:javascript
运行
复制
127.0.0.1 - - [25/Jun/2018 15:41:51] "GET / HTTP/1.1" 200 -
after_response

这个答案是从我的答案herehere中总结出来的。

票数 10
EN
查看全部 6 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18082683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档