NDB与Google App Engine GAE中的Flask异步访问兼容性

时间:2017-09-21 01:44:07

标签: google-app-engine flask google-cloud-datastore app-engine-ndb toplevel

我一直在浏览Google Cloud 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'

当我将toplevel直接移回请求处理程序时,此错误消失了。 我觉得无论是烧瓶都无法使用此功能,或者我在使用顶层方面做错了。 我的目的是让我的应用程序中的每个请求处理程序在退出之前等待所有异步Google DataStore调用完成(我在请求处理程序中使用yield语句和tasklet)。

1 个答案:

答案 0 :(得分:0)

错误很有意义:app不再是您创建的Flask应用。我看到有两种选择:

  • 重命名顶级应用(您还需要匹配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属性错误,但我不知道它是否会最终使顶级内容工作。但我不能把它写成评论。