0

Je vais à travers le NDB nuage google Async examles tutorielsNDB compatibilité d'accès Async avec Flask dans Google App Engine GAE

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

Vous pouvez spécifier un WSGIApplication tout comme ndb.toplevel. Cela rend que chaque gestionnaire de WSGIApplication attend toutes les demandes asynchrones avant de retourner. (Il ne "toplevel" tous les gestionnaires de l' WSGIApplication.)

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

Est-ce même fonctionnalité compatible avec Flask? Par exemple mon code

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

me donne l'erreur

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' 

Cette erreur disparaît lorsque je déplace le premier niveau de retour directement au gestionnaire de requêtes. Je pense que les deux flacons ne fonctionnent pas avec cette fonctionnalité, ou je fais quelque chose de mal dans la façon dont j'utilise toplevel. Mon intention est que chacun de mes gestionnaires de requêtes dans mon application attende que tous les appels asynchrones de Google DataStore se terminent avant de quitter (j'utilise des instructions de rendement et des tasklets dans mes gestionnaires de requêtes).

Répondre

0

L'erreur est en quelque sorte attendue: app n'est plus l'application Flask que vous avez créée. Je vois 2 options pour essayer:

  • renomme l'application de haut niveau (vous devez faire correspondre le changement dans le fichier de configuration app.yaml ainsi):

    app = Flask(__name__) 
    app.config.update(DEBUG = not SERVER_ISPRODUCTION) 
    my_app = ndb.toplevel(app) # change .app -> .my_app app.yaml 
    
  • renommer l'application flacon et toute sa références:

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

note: Je ne suis pas un utilisateur Flask, ce peut résoudre le manque route erreur d'attribut mais je ne sais pas si cela va finalement faire fonctionner les choses de haut niveau. Mais je ne peux pas écrire ceci comme commentaire.

+0

Cela fonctionne pour résoudre le problème tel que décrit. La plus grande question de savoir si toplevel fonctionne avec la fiole reste encore. Quand je cours comme décrit, il semble que mon application se termine sans attendre que les appels ndb asynchrones reviennent sur les rendements. J'utilise la fonction get_or_insert_async, qui ne semble pas persister dans le magasin de données lorsque l'application se ferme avant la réponse. Au lieu de la compatibilité flacon avec ndb, quels frameworks savez-vous bien fonctionner avec async ndb? Webapp2? – Dave

+0

Oui, webapp2 fonctionne très bien pour moi. Mais j'ai seulement utilisé 'ndb.toplevel' au niveau des méthodes get/set du gestionnaire, pas au niveau de l'application. –