Scrapy documentation说:
第一个 中间件是更接近的中间件 引擎和最后一个更接近 下载者。
决定分配的订单 你的中间件看到了 DOWNLOADER_MIDDLEWARES_BASE设置 并根据地点选择一个值 你想插入中间件。该 订单确实很重要因为每个 中间件执行不同的操作 而你的中间件可能依赖于 一些以前(或后续) 中间件正在应用
我不完全清楚这个值是否会导致中间件更高 首先执行,反之亦然。
E.g。
'myproject.middlewares.MW1': 543,
'myproject.middlewares.MW2': 542,
问题:
答案 0 :(得分:7)
我知道这已经得到了解答,但实际上这是一个更复杂的事情 - 请求和响应的处理方式相反。
你可以这样想:
所以...如果我将我的中间件标记为数字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)
- 首先执行哪一项?我的试验说MW2将是第一个。
醇>
正如你引用文档:
第一个中间件是靠近引擎的中间件,最后一个是靠近下载器的中间件。
因此,值为542的下载器中间件在值为543的中间件之前执行。这意味着第一个myproject.middlewares.MW1.process_request(request, spider)
被调用,并且在更改(如果需要)请求之后,它是传递给下一个下载中间件。
- 订单的有效范围是多少? 0 - 999?
醇>
该值是一个整数。
<强>更新强>
查看architecture。
另外,完整quote:
DOWNLOADER_MIDDLEWARES设置与 在Scrapy中定义的DOWNLOADER_MIDDLEWARES_BASE设置(并不意味着 被覆盖)然后按顺序排序以获得最终排序 已启用的中间件列表:第一个中间件是更接近的中间件 引擎和最后一个是靠近下载器的那个。
因此,由于值是整数,因此它们具有一系列Python整数。