【问题标题】:Flask teardown_request happening before request sentFlask teardown_request 在请求发送之前发生
【发布时间】:2014-11-12 07:47:28
【问题描述】:

我对 Flask 中的 @app.teardown_request 装饰器有疑问。

我的代码是这样的

@app.teardown_request
def teardown_request(exception):
   print 'teardown'

@app.after_request
def after_request(response):
   print 'after'
   return response

@app.route('/entire', methods=['GET'])
def entire():
   print 'entire'
   return 'This is a text'

@app.route('/chunked', methods=['GET'])
def chunked():
   text = 'This is a text'
   def gen(t):
       print 'chunked'
       for a in t:
            yield a
   return gen(text)

当我转到 /entire 端点时,我得到了

 after
 teardown
 entire

当我转到 /chunked 端点时,我得到了

 chunked
 after
 teardown

因此,当以大块的方式返回数据时,请求拆卸实际上是在我返回任何数据之前发生的(也不执行任何生成此数据的代码)。

来自 sqlalchemy 会话的数据,我发现自己在对查询进行任何操作之前关闭了会话 - 然后我得到的行为是到处都是 idle in transaction...

【问题讨论】:

    标签: python flask sqlalchemy flask-sqlalchemy


    【解决方案1】:

    Flask 在返回响应时销毁上下文,而不是在生成器运行之后。使用stream_with_context 为生成器保留上下文。

    from flask import Response, stream_with_context
    
    return Response(stream_with_context(gen(text)))
    

    【讨论】:

      猜你喜欢
      • 2015-03-12
      • 1970-01-01
      • 2011-07-16
      • 2013-05-06
      • 2012-07-04
      • 2015-02-07
      • 2010-12-10
      • 2013-11-04
      • 2015-04-14
      相关资源
      最近更新 更多