2011-07-08 10 views
5

Scrapy documentationは言う:Scrapyミドルウェア順

最初 ミドルウェアは エンジンに近く、最後の1がダウンローダに 近い1です。

は、あなたのミドルウェアが 設定 DOWNLOADER_MIDDLEWARES_BASEを見ると、あなたがミドルウェアを挿入する場所 に応じた値を選ぶ に割り当てるためにどの順序を決定します。各 ミドルウェアは異なるアクション を実行し、あなたのミドルウェアが に依存する可能性があるため 順番は関係ありませんいくつかの ミドルウェアが適用され、前の(またはそれ以降)私は高い値があるかどうか、このから完全には明らかではないよ

結果としてミドルウェア が最初に実行されたり、その逆が実行されたりします。

など。

'myproject.middlewares.MW1': 543, 
'myproject.middlewares.MW2': 542, 

質問:

  1. 最初に実行されるこれらの?私の裁判では、MW2が最初になると言われています。
  2. 注文の有効範囲はどのくらいですか? 0〜999?最初に実行されるこれらの

答えて

4
  1. ?私の裁判では、MW2が最初になると言われています。

あなたがドキュメントを引用したよう:

最初のミドルウェアがダウンローダに近い1であるエンジンに近いと最後のものです。

542の値にミドルウェア値543とミドルウェア前に実行されるように、ダウンローダはmyproject.middlewares.MW1.process_request(request, spider)最初に呼び出されることを意味し、(必要な場合)には、変更された要求は、それが次のダウンローダミドルウェアに渡された後に。

  1. 注文の有効範囲は何ですか? 0〜999?

値は整数です。

UPDATE:architecture

ルック。また

quoteフル:

はDOWNLOADER_MIDDLEWARES設定が最終的に得るためでScrapyで定義されて DOWNLOADER_MIDDLEWARES_BASE設定と合併(およびオーバーライドする を意図するものではない)、その後 がソートされ

ソート 有効なミドルウェアのリスト:最初のミドルウェアは に近いもので、最後はミキサーに近いものです。

したがって、値は整数なので、範囲はPython整数です。

+0

エンジンに近いものが542であるとどう結論していますか? 2番目の質問では、範囲を尋ねることを意味します。0〜999か整数ですか? – Medorator

+0

更新を参照してください。 – warvariuc

5

私はこれが答えられたことを知っていますが、実際はもっと複雑なことです。要求と応答は逆の順序で処理されます。

あなたはこのように考えることができ:

  • 0 - エンジンは
  • 1..infを要求します - 要求ミドルウェアがなかった場合は、実際のダウンロードが起こる( - process一ミドルウェアは
  • infファイルを呼び出しますそれを扱う)
  • inf..1 - process_resonseミドルウェアは
  • 0を呼び出す - エンジンが受信した応答

私のミドルウェアに番号1のタグを付けると、最初のリクエストミドルウェアが実行され、最後のレスポンスミドルウェアが実行されます...ミドルウェアが901として実行されると、LASTリクエストミドルウェアが実行され、FIRSTレスポンスミドルウェア実行されます(デフォルトミドルウェアのみが定義されている場合)。

本当に答えは、それが混乱しているということです。要求の開始はエンジンに最も近く(ゼロ)、要求の終了はダウンローダに最も近い(高い数値)。応答の開始はダウンローダ(高い番号)に最も近く、応答の終わりはエンジンに最も近い(ゼロで)。それは、エンジンから出て戻って旅のようなものだ...ここにこのすべてとても楽しい(INITと参照用MiddlewareManagerからコピーされ、唯一の関連するメソッドが含ま)を行うscrapyから該当するコードは次のとおりです。

class DownloaderMiddlewareManager(MiddlewareManager): 
    def __init__(self, *middlewares): 
     self.middlewares = middlewares 
     self.methods = defaultdict(list) 
     for mw in middlewares: 
      self._add_middleware(mw) 

    def _add_middleware(self, mw): 
     if hasattr(mw, 'process_request'): 
      self.methods['process_request'].append(mw.process_request) 
     if hasattr(mw, 'process_response'): 
      self.methods['process_response'].insert(0, mw.process_response) 
     if hasattr(mw, 'process_exception'): 
      self.methods['process_exception'].insert(0, mw.process_exception) 

ご覧のように、リクエストメソッドはソートされた順番(背番号に高い数字が追加されています)に追加され、応答メソッドと例外メソッドが最初に挿入されます(高い番号が最初に追加されます)。