0

私はあなたが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文とタスクレットを使用しています)。

答えて

0

エラーは予想通りです:appは、作成したFlaskアプリケーションではなくなりました。

  • は(あなたにもapp.yaml設定ファイルの変更を一致させる必要がある)トップレベルのアプリの名前を変更します:私はしようとする2つのオプションを参照してください

    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** 
    

注:私はフラスコのユーザーではないよ、これが不足している問題を解決するroute属性のエラーですが、最終的にトップレベルのものが動作するかどうかはわかりません。しかし、私はこれをコメントとして書くことはできません。

+0

これは、説明した問題を解決するために機能します。フラスコでトップレベルの作品が残っているかどうかの大きな疑問は依然として残っています。私が説明したように実行すると、非同期ndb呼び出しがyieldを返すのを待つことなく、アプリケーションが終了しているように見えます。私はget_or_insert_async関数を使用しています。これは、アプリケーションが応答の前に終了するときにデータストアに何も永続化していないようです。 ndbとのフラスコの互換性の代わりに、どのフレームワークが非同期ndbでうまく動作するかを知っていますか? Webapp2? – Dave

+0

はい、webapp2はうまく動作します。しかし、アプリケーションレベルではなく、ハンドラのget/setメソッドレベルで 'ndb.toplevel'しか使用しませんでした。 –

関連する問題