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).
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
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. –