私はあなたがndb.toplevelとして全体WSGIApplicationを指定することができGoogleクラウドNDB非同期examlesチュートリアルNDB非同期アクセスの互換性
https://cloud.google.com/appengine/docs/standard/python/ndb/async
を経てきました。これにより、 は、WSGIApplicationのハンドラのそれぞれが、返す前にすべての非同期の 要求を待機することを確認します。 (これは「トップレベル」の全て WSGIApplicationのハンドラません。)
app = ndb.toplevel(webapp2.WSGIApplication([('/', MyRequestHandler)]))
フラスコと互換性がこれと同じ機能はありますか?例えば、私のコード
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文とタスクレットを使用しています)。
これは、説明した問題を解決するために機能します。フラスコでトップレベルの作品が残っているかどうかの大きな疑問は依然として残っています。私が説明したように実行すると、非同期ndb呼び出しがyieldを返すのを待つことなく、アプリケーションが終了しているように見えます。私はget_or_insert_async関数を使用しています。これは、アプリケーションが応答の前に終了するときにデータストアに何も永続化していないようです。 ndbとのフラスコの互換性の代わりに、どのフレームワークが非同期ndbでうまく動作するかを知っていますか? Webapp2? – Dave
はい、webapp2はうまく動作します。しかし、アプリケーションレベルではなく、ハンドラのget/setメソッドレベルで 'ndb.toplevel'しか使用しませんでした。 –