Je souhaite interroger de façon asynchrone une base de données pour les clés, puis envoyer des demandes à plusieurs adresses pour chaque clé.Base de données de requête asynchrone pour les clés à utiliser dans plusieurs requêtes
J'ai une fonction qui retourne un Deferred
de la base de données dont la valeur est la clé pour plusieurs demandes. Idéalement, je voudrais appeler cette fonction et retourner un générateur de différés de start_requests
.
@inlineCallbacks
def get_request_deferred(self):
d = yield engine.execute(select([table])) # async
d.addCallback(make_url)
d.addCallback(Request)
return d
def start_requests(self):
????
Mais tenter de plusieurs façons soulève
builtins.AttributeError: 'Deferred' object has no attribute 'dont_filter'
que je considère dire que start_requests
doit retourner Request
objets, non Deferreds dont les valeurs sont Request
objets. La même chose semble être vraie pour le middleware de l'araignée process_start_requests()
.
Alternativement, je peux faire des demandes initiales à, par exemple, http://localhost/
et les changer pour l'url réel une fois que la clé est disponible à partir de la base de données par l'intermédiaire du middleware process_request()
du téléchargeur. Toutefois, process_request
renvoie uniquement un objet Request
; il ne peut pas donner des demandes de plusieurs pages en utilisant la clé: la tentative yield Request(url)
soulève
AssertionError: Middleware myDownloaderMiddleware.process_request
must return None, Response or Request, got generator
Quelle est la solution la plus propre à
- obtenir pour chaque touche du clavier en mode asynchrone base de données
- , générer plusieurs demandes
Jetez un oeil http://techspot.zzzeek.org/2015/02/15/asynchronous-python-and-databases/ – MishaVacic