Scrapy 文档 says :
首先
中间件是最接近的一个
发动机,最后一个更接近
到下载器。
决定分配给哪个订单
你的中间件看到
DOWNLOADER_MIDDLEWARES_BASE 设置
并根据位置选择一个值
你想插入中间件。这
顺序很重要,因为每个
中间件执行不同的操作
你的中间件可能依赖于
一些先前的(或后续的)
正在应用的中间件
我并不完全清楚更高的值是否会导致中间件
首先被执行,反之亦然。
E.g.
'myproject.middlewares.MW1': 543,
'myproject.middlewares.MW2': 542,
问题 :
- 其中哪一个将首先被执行?我的试验表明《MW2》将是第一个。
- 订单的有效范围是多少? 0 - 999?
我知道这个问题已经得到解答,但实际上这是一件更复杂的事情——请求和响应以相反的顺序处理。
你可以这样想:
- 0 - 引擎发出请求
- 1..inf - process_request 中间件调用
- inf - 实际下载发生(如果请求中间件没有处理它)
- inf..1 - process_resonse 中间件调用
- 0 - 引擎收到响应
所以...如果我将我的中间件标记为数字1,它将是执行的第一个请求中间件和执行的最后一个响应中间件...如果我的中间件为901,它将是执行的最后一个请求中间件和执行的第一个响应中间件(如果仅定义了默认中间件)。
事实上,答案是令人困惑。请求的开始位置最接近引擎(零),请求的结束位置最接近下载器(高数字)。响应的开始最接近下载器(高数字),响应的结束最接近引擎(零)。这就像从引擎来回的旅行...这是来自 scrapy 的相关代码,它使这一切变得如此有趣(与init从 MiddlewareManager 复制以供参考,仅包含相关方法):
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)
如您所见,请求方法按排序顺序附加(数字较大的添加到后面),响应和异常方法插入在开头(数字较大的在最前面)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)