Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 胶状订单_Python_Middleware_Scrapy - Fatal编程技术网

Python 胶状订单

Python 胶状订单,python,middleware,scrapy,Python,Middleware,Scrapy,Scrapy说: 第一 中间件更接近于 引擎和最后一个是一个更接近 到下载程序 决定分配给哪个顺序 您的中间件可以看到 下载程序\u中间件\u基础设置 然后根据位置选择一个值 您想插入中间件。这个 秩序很重要,因为每个人 中间件执行不同的操作 您的中间件可以依赖于 一些以前的(或以后的) 正在应用的中间件 从这一点上,我并不完全清楚更高的值是否会产生中间件 先被处决,反之亦然 例如 问题: 以下哪一项将首先执行?我的试验表明MW2将是第一个 订单的有效范围是多少?0-999 以下哪一项将首先执行

Scrapy说:

第一 中间件更接近于 引擎和最后一个是一个更接近 到下载程序

决定分配给哪个顺序 您的中间件可以看到 下载程序\u中间件\u基础设置 然后根据位置选择一个值 您想插入中间件。这个 秩序很重要,因为每个人 中间件执行不同的操作 您的中间件可以依赖于 一些以前的(或以后的) 正在应用的中间件

从这一点上,我并不完全清楚更高的值是否会产生中间件 先被处决,反之亦然

例如

问题:

  • 以下哪一项将首先执行?我的试验表明MW2将是第一个
  • 订单的有效范围是多少?0-999
  • 以下哪一项将首先执行?我的试验表明MW2将是第一个
  • 正如你引用的文件:

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

    因此,值为542的downloader中间件在值为543的中间件之前执行。这意味着调用first,并在它更改(如果需要)请求后,将其传递给下一个downloader中间件

  • 订单的有效范围是多少?0-999
  • 该值是一个整数

    更新:

    看这张照片

    此外,全文如下:

    DOWNLOADER\u Middleware设置与 Scrapy中定义的DOWNLOADER\u Middleware\u基本设置(并不意味着 然后按顺序排序
    ,以获得最终排序结果 启用的中间件列表:第一个中间件更接近 发动机和最后一个是靠近下载器的发动机


    因此,由于这些值是整数,因此它们具有Python整数的范围。

    我知道这已经得到了回答,但实际上这是一件更复杂的事情——请求和响应的处理顺序相反

    你可以这样想:

    • 0-引擎发出请求
    • 1..inf-进程请求中间件调用
    • inf-实际下载发生(如果请求中间件没有处理它)
    • inf..1-处理\u响应中间件调用
    • 0-发动机接收到的响应
    所以。。。如果我将我的中间件标记为1号,它将是第一个执行的请求中间件和最后一个执行的响应中间件。。。如果我的中间件是901,那么它将是最后一个执行的请求中间件和第一个执行的响应中间件(如果只定义了默认中间件)

    事实上,答案是令人困惑。请求的开始距离发动机最近(零),请求的结束距离下载器最近(高数值)。响应的开始位置离下载器最近(高数值),响应的结束位置离发动机最近(零)。这就像是从引擎上来回的旅行。。。以下是来自scrapy的相关代码,使这一切变得如此有趣(从MiddlewareManager复制的init仅供参考,仅包含相关方法):


    正如您所看到的,请求方法按排序顺序出现(后面添加的数字越高),响应和异常方法则插入到开头(数字越高)。

    您如何得出更接近引擎的方法是542的结论?对于第二个问题,我的意思是问范围,是0到999还是任何整数?
    'myproject.middlewares.MW1': 543,
    'myproject.middlewares.MW2': 542,
    
    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)