0

我一直在浏览谷歌云 NDB Async 考试教程

https://cloud.google.com/appengine/docs/standard/python/ndb/async

您可以将整个 WSGIApplication 指定为 ndb.toplevel。这确保了每个 WSGIApplication 的处理程序在返回之前等待所有异步请求。(它不会“顶级”所有 WSGIApplication 的处理程序。)

app = ndb.toplevel(webapp2.WSGIApplication([('/', MyRequestHandler)]))

这个相同的功能是否与 Flask 兼容?例如我的代码

app = Flask(__name__)
app.config.update(DEBUG = not SERVER_ISPRODUCTION)
app = ndb.toplevel(app)
...
@app.route('/test')
def testBackfill(): 

给我错误

Traceback (most recent call last):
   File "/base/data/home/runtimes/python27_experiment/python27_lib/versions/1/google/appengine/runtime/wsgi.py", line 240, in Handle
    handler = _config_handle.add_wsgi_middleware(self._LoadHandler())
   File "/base/data/home/runtimes/python27_experiment/python27_lib/versions/1/google/appengine/runtime/wsgi.py", line 299, in _LoadHandler
    handler, path, err = LoadObject(self._handler)
   File "/base/data/home/runtimes/python27_experiment/python27_lib/versions/1/google/appengine/runtime/wsgi.py", line 85, in LoadObject
    obj = __import__(path[0]) 
    @app.route('/test')
 AttributeError: 'function' object has no attribute 'route'

当我将顶层直接移回请求处理程序时,此错误就会消失。我觉得要么烧瓶无法使用此功能,要么我在使用顶层时做错了什么。我的意图是让我的应用程序中的每个请求处理程序在退出之前等待我的所有异步 Google DataStore 调用完成(我在我的请求处理程序中使用 yield 语句和小任务)。

4

1 回答 1

0

该错误是意料之中的:app不再是您创建的 Flask 应用程序。我看到 2 个选项可以尝试:

  • 重命名顶级应用程序(您还需要匹配app.yaml配置文件中的更改):

    app = Flask(__name__)
    app.config.update(DEBUG = not SERVER_ISPRODUCTION)
    my_app = ndb.toplevel(app)  # change .app -> .my_app app.yaml
    
  • 重命名烧瓶应用程序及其所有引用:

    flask_app = Flask(__name__)
    flask_app.config.update(DEBUG = not SERVER_ISPRODUCTION)
    app = ndb.toplevel(flask_app)
    ...
    @flask_app.route('/test')
    def testBackfill(): **strong text**
    

注意:我不是 Flask 用户,这可能会修复缺少的route属性错误,但我不知道它是否最终会让顶级的东西工作。但我不能把它写成评论。

于 2017-09-22T00:57:05.983 回答