データベースに対して非同期にキーを照会し、各キーの複数のURLへのリクエストを行いたいとします。複数のリクエストで使用するキーの非同期クエリデータベース
私は、値がいくつかのリクエストのキーであるデータベースからDeferred
を返す関数を持っています。理想的には、私はこの関数を呼び出して、Deferredsのジェネレータを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):
????
しかし、いくつかの方法でこれをしようとは、私はstart_requests
はRequest
オブジェクトではなく、その値Request
オブジェクトであるのDeferredを返さなければならないことを意味すると取る
builtins.AttributeError: 'Deferred' object has no attribute 'dont_filter'
を発生させます。スパイダーミドルウェアのprocess_start_requests()
も同様です。
また、http://localhost/
などの初期リクエストを作成し、ダウンローダミドルウェアのprocess_request()
を使用してデータベースからキーを入手すると、実際のURLに変更することができます。ただし、process_request
はRequest
オブジェクトのみを返します。それは、キーを使用して複数のページに要求を得られないことができます:yield Request(url)
をしようとすると、
- にきれいな解決策は、各キーのデータベース
- から非同期キーを取得されて何
AssertionError: Middleware myDownloaderMiddleware.process_request must return None, Response or Request, got generator
を発生させ、いくつかの要求
を生成します
http://techspot.zzzeek.org/2015/02/15/asynchronous-python-and-databases/ – MishaVacic