【问题标题】:Doing something *after* handling a request in Google App Engine*在*处理 Google App Engine 中的请求后做某事
【发布时间】:2011-01-05 09:32:24
【问题描述】:

我希望 GAE 在我的应用发送响应后执行其他操作。

处理程序如下所示:

class FooHandler(webapp.RequestHandler):
    def post(self):
        self.response.out.write('Bar')
        send_response()     # this is where I need help!
        do_something_else() # at this point, the response should have been sent

如果你想知道我为什么要这样做:

我需要类似线程的行为,这是 GAE 的沙盒环境所不允许的。因此,一个函数发送多个请求而不关心响应。每个请求都会启动一个耗时的操作(获取资源)并将结果保存到数据存储区,供第一个函数使用。

注意:请求处理程序必须发送响应。如果您不提供任何内容,它将等待 post 函数完成,然后返回默认标题(当然,这不是我要寻找的行为)

如果有帮助,解决方案可能是使用自定义 wsgi middeleware,但我不知道它是如何工作的(目前)...

【问题讨论】:

    标签: python google-app-engine wsgi


    【解决方案1】:

    假设您可以访问 WSGI 层,您可以包装 WSGI 应用程序并提供一个回调,以便在响应发送后执行。有关如何执行此操作,请参阅:

    http://code.google.com/p/modwsgi/wiki/RegisteringCleanupCode

    虽然这来自 mod_wsgi 文档,但请求示例末尾的清理应该适用于任何 WSGI 兼容堆栈。

    【讨论】:

    • 在响应内容被 mod_wsgi 消费并写回客户端之前,实际上会调用清理函数
    • 正确阅读参考文档。那里有两个配方,一个在来自 WSGI 应用程序的初始响应时触发,另一个在完整响应已被消耗并写回客户端时触发,或者在客户端连接被中止的情况下,在连接丢失之后一切正在清理。因此,请使用记录在案的正确代码,它应该可以按需要工作。
    • @Graham:无关紧要,因为 App Engine 在脚本返回之前不会将响应返回给用户。
    • @Nick:WSGI PEP 所说的 WSGI 适配器实现必须做的事情或多或少地保证了这种行为。如果 GAE 说它实现了 WSGI,但它没有按照文档解释 WSGI 适配器的方式工作,那么 GAE 没有正确实现 WSGI 规范。请参阅“python.org/dev/peps/pep-0333/#specification-details”中以“如果应用程序返回的可迭代对象具有 close() 方法”开头的 WSGI PEP 段落。从应用程序的角度来看,它应该是足够的,因为它是应用程序做某事的最后机会。
    • @Nick:另请阅读“python.org/dev/peps/pep-0333/#buffering-and-streaming”中以“WSGI 服务器、网关和中间件不得延迟任何块的传输”开头的段落。这其实是根本原因。如果 GAE 像您建议的那样缓冲完整的响应并仅在脚本返回时将其发送回 HTTP 客户端,从而防止响应流式传输,那么这就是违规的地方。
    【解决方案2】:

    如果您确实需要线程,您将无法在 RequestHandler 返回时发送它的响应,您需要在另一家托管公司编写您的 Web 应用程序。

    【讨论】:

      【解决方案3】:

      也许你可以使用Task Queues

      【讨论】:

      【解决方案4】:

      如前所述,您可以使用task queuesdeferred API。 Rafe Kaplan 在this talk here 部分的末尾概述了另一种选择:您可以使用结果挂钩函数执行异步 API 调用来处理结果,并在调用完成时调用结果挂钩,响应返回给用户之后!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-18
        • 2012-11-13
        • 2011-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多