J'essaie de créer une API qui va collecter les réponses de plusieurs autres API et combiner les résultats en une seule réponse. Je veux envoyer les requêtes get de manière asynchrone afin qu'elle s'exécute plus rapidement, mais même si j'utilise des coroutines et que je cède, mon code semble toujours faire une requête à la fois. Vous vous demandez peut-être si c'est parce que j'utilise la bibliothèque de requêtes au lieu de AsyncHTTPClient de tornado, ou parce que j'appelle self.path_get dans une boucle, ou parce que je stocke les résultats dans une variable d'instance?Frapper plusieurs API à la fois, tornade et python
Les API que je suis en train de retourner des tableaux d'objets JSON, et je veux les combiner tous dans un tableau et écrire cela à la réponse.
from tornado import gen, ioloop, web
from tornado.gen import Return
import requests
PATHS = [
"http://firsturl",
"http://secondurl",
"http://thirdurl"
]
class MyApi(web.RequestHandler):
@gen.coroutine
def get(self):
self.results = []
for path in PATHS:
x = yield self.path_get(path)
self.write({
"results": self.results,
})
@gen.coroutine
def path_get(self, path):
resp = yield requests.get(path)
self.results += resp.json()["results"]
raise Return(resp)
ROUTES = [
(r"/search", MyApi),
]
def run():
app = web.Application(
ROUTES,
debug=True,
)
app.listen(8000)
ioloop.IOLoop.current().start()
if __name__ == "__main__":
run()
Oui, ça marche, merci! – littlegreenbird