Scrapy中间件订单

2023-11-26

Scrapy 文档 says :

首先 中间件是最接近的一个 发动机,最后一个更接近 到下载器。

决定分配给哪个订单 你的中间件看到 DOWNLOADER_MIDDLEWARES_BASE 设置 并根据位置选择一个值 你想插入中间件。这 顺序很重要,因为每个 中间件执行不同的操作 你的中间件可能依赖于 一些先前的(或后续的) 正在应用的中间件

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

E.g.

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

问题 :

  1. 其中哪一个将首先被执行?我的试验表明《MW2》将是第一个。
  2. 订单的有效范围是多少? 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(使用前将#替换为@)

Scrapy中间件订单 的相关文章

随机推荐

  • DDK“你好世界”

    如何开始为 Windows 编写驱动程序 是否有某种官方 DDK Hello World 示例 虽然我确信一开始这会超出我的想象 但最终我想创建一个简单的 MIDI 驱动程序 就像枫木虚拟 MIDI 电缆其中 MIDI 消息来自用户应用程序
  • 将 div 高度设置为父级的 100%

    我想要我的网页具有以下布局 header navigation details 其中导航窗格 动态生成的内容 包含数百个元素 我希望在导航窗格上创建一个垂直滚动条 以便该窗格的高度减去标题的高度 我的页面大致结构如下 div div div
  • 在 Mac OS X 上的 Docker 中启用远程 API (boot2docker)

    我似乎不知道如何在使用 boot2docker 时启用远程 API 我尝试按如下方式使用 dockerode Docker require dockerode docker new Docker socketPath var run doc
  • JVM 内存:为什么任务管理器上的内存与 JProbe(或 JConsole 工具)不同

    我面临的问题是我的应用程序使用的内存只有100MB 之后减少了50MB 但在窗口任务管理器上它显示150MB并且总是保持或增加但不减少 我们如何减少任务管理器上的内存 私人工作集 你所看到的JConsole 或其他监控工具 是java内存正
  • 为什么我似乎无法强制 Oracle 11g 为单个 SQL 查询消耗更多 CPU

    我有一些在巨大的表上运行的巨大查询 这些查询似乎存在 CPU 瓶颈 并且运行了数小时 据我所知 Oracle 在 11g 第 2 版中有很多新功能 可以在内部并行化查询的执行 然而 无论我在查询中添加何种提示 我似乎都无法在数据库框中使用超
  • 使用 python 从网页中提取所有链接

    在 Udacity 的计算机科学简介课程之后 我正在尝试制作一个 python 脚本来从页面中提取链接 下面是我使用的代码 我收到以下错误 NameError 名称 页面 未定义 这是代码 def get page page try imp
  • dicts 在 python 3 中不可排序?

    为什么字典在 python2 中是可排序的 但在 python3 中却不能 我在文档中找不到它 Python 3 3 4 default Feb 11 2014 16 14 21 gt gt gt sorted a a b b Traceb
  • mysqli 中的位标志使用 fetch_field_direct 意味着什么

    使用 mysqli 我可以获取有关字段的信息 如下所示 field mysqli fetch field direct result fieldCount 我可以使用从结果中获取字段标志 field gt flags PHP 手册说这会返回
  • ASP.NET MVC 2 RC 客户端验证不起作用

    我似乎无法在 MVC 2 RC 应用程序上进行任何客户端验证 我的模型有以下内容 public class ExampleModel Required ErrorMessage Test1 is required DisplayName T
  • 设置 Gradle 以在 Android Studio 中运行 Java 可执行文件

    所以事情是这样的 我使用的是 Android 版 ORMLite 它使用注释来在 Android 中进行映射 如您所知 Android 中的注释速度很慢 ORMLite 的开发者已经意识到这一点 因此他们添加了运行 java 可执行文件来生
  • 如何检查一个对象是列表还是元组(但不是字符串)?

    这是我通常所做的 以确定输入是list tuple 但不是str 因为很多次我偶然发现函数传递一个错误str错误地对象 并且目标函数确实for x in lst假如说lst实际上是一个list or tuple assert isinsta
  • Flutter Stack 更改深度

    我有一个带有 3 个定位小部件的堆栈 并且作为一个孩子有一个 GestureDetector 我可以拖动它们 但我也想在您单击它时将单击的那个带到前面 我尝试在父窗口小部件中调用更改状态 但这也交换了受影响的窗口小部件的位置 这是完整的示例
  • 将 jquery 对象链接/取消链接到元素

    我正在使用 jquery flowplayer 工具插件http flowplayer org tools tooltip html 1 我希望在用户单击某个元素时创建一个工具提示 2 当用户点击另一个元素时 旧的工具提示必须取消链接 删除
  • JavaScript 的简单(非安全)哈希函数? [复制]

    这个问题在这里已经有答案了 可能的重复 从 Javascript jQuery 中的字符串生成哈希 谁能建议一个用 浏览器兼容 JavaScript 编写的简单 即数十行代码 而不是数百行 哈希函数 理想情况下 我想要的东西是 当传递一个字
  • 用c#获取每个资源管理器窗口的路径

    我对 C 很陌生 我很无聊 有时我关闭一个窗口 几秒钟后我注意到我再次需要该窗口 并且重新打开 Windows 资源管理器并导航到该特定路径让我感到非常沮丧 所以我想创建一个小应用程序 允许我存储最后关闭的窗口的列表 使用快捷键可以一一恢复
  • MySQL 返回连接表的第一行

    我有两个表 国家和鸭子 其中国家 地区表包含世界上的每个国家 地区 鸭子表包含鸭子列表 其中包含用于链接到主要国家 地区的 Country id 字段 我正在尝试获取仅包含至少一只鸭子的国家 地区的列表 并从鸭子表中获取该国家 地区评价最高
  • Android - 单击一项后保持 ListView 的项目突出显示

    所以我有一个活动 2ListView小部件 当您在第一个小部件中选择一个值时 第二个小部件将填充与第一个小部件中的选择相关的值ListView 这个机制工作没有问题 但现在我希望用户选择保持突出显示 我已经阅读了大量与该主题相关的问题 似乎
  • 通用扩展和实现

    我不明白为什么Company编译 我以为它检查了extends但不是为了implements public interface Employee public class HourlyEmployee implements Employee
  • 向 HTML 文本区域添加行号

    我有一个
  • Scrapy中间件订单

    Scrapy 文档 says 首先 中间件是最接近的一个 发动机 最后一个更接近 到下载器 决定分配给哪个订单 你的中间件看到 DOWNLOADER MIDDLEWARES BASE 设置 并根据位置选择一个值 你想插入中间件 这 顺序很重