Scrapy中间件订单

时间:2011-07-08 10:55:46

标签: python middleware scrapy

Scrapy documentation说:

  

第一个   中间件是更接近的中间件   引擎和最后一个更接近   下载者。

     

决定分配的订单   你的中间件看到了   DOWNLOADER_MIDDLEWARES_BASE设置   并根据地点选择一个值   你想插入中间件。该   订单确实很重要因为每个   中间件执行不同的操作   而你的中间件可能依赖于   一些以前(或后续)   中间件正在应用

我不完全清楚这个值是否会导致中间件更高 首先执行,反之亦然。

E.g。

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

问题:

  1. 首先执行哪一项?我的试验说MW2将是第一个。
  2. 订单的有效范围是多少? 0 - 999?

2 个答案:

答案 0 :(得分:7)

我知道这已经得到了解答,但实际上这是一个更复杂的事情 - 请求和响应的处理方式相反。

你可以这样想:

  • 0 - 引擎提出请求
  • 1..inf - process_request中间件调用
  • inf - 实际下载发生(如果请求中间件没有处理它)
  • inf..1 - process_resonse中间件调用
  • 0 - 引擎收到的响应

所以...如果我将我的中间件标记为数字1,那么将执行FIRST请求中间件并执行LAST响应中间件...如果我的中间件为901,那么它将是执行的LAST请求中间件和FIRST响应中间件执行(如果只定义了默认中间件)。

真的答案是它令人困惑。请求的开始距离引擎最近(为零),请求的结尾最接近下载程序(高位数)。响应的开始最接近下载器(高数字),​​响应结束最接近引擎(零)。这就像是从引擎中跳出来的......这是来自scrapy的相关代码,这使得这一切变得如此有趣(从MiddlewareManager中复制 init 以供参考,仅包括相关方法):

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)

正如您所看到的,请求方法按排序顺序(后面添加了更高的数字),并在开头插入响应和异常方法(更高的数字是第一个)。

答案 1 :(得分:4)

  
      
  1. 首先执行哪一项?我的试验说MW2将是第一个。
  2.   

正如你引用文档:

  

第一个中间件是靠近引擎的中间件,最后一个是靠近下载器的中间件。

因此,值为542的下载器中间件在值为543的中间件之前执行。这意味着第一个myproject.middlewares.MW1.process_request(request, spider)被调用,并且在更改(如果需要)请求之后,它是传递给下一个下载中间件。

  
      
  1. 订单的有效范围是多少? 0 - 999?
  2.   

该值是一个整数。

<强>更新

查看architecture

另外,完整quote

  

DOWNLOADER_MIDDLEWARES设置与   在Scrapy中定义的DOWNLOADER_MIDDLEWARES_BASE设置(并不意味着   被覆盖)然后按顺序排序以获得最终排序   已启用的中间件列表:第一个中间件是更接近的中间件   引擎和最后一个是靠近下载器的那个。

因此,由于值是整数,因此它们具有一系列Python整数。