Заказ связующего ПО Scrapy - PullRequest
6 голосов
/ 08 июля 2011

Scrapy документация говорит:

первое промежуточное ПО находится ближе к двигателю, а последнее ближе к загрузчику.

Длярешить, какой порядок назначить промежуточному программному обеспечению, смотрите в параметре DOWNLOADER_MIDDLEWARES_BASE и выбрать значение в соответствии с тем, куда вы хотите вставить промежуточное программное обеспечение.Порядок имеет значение, потому что каждое промежуточное ПО выполняет свое действие, и ваше промежуточное ПО может зависеть от того, какое примененное ранее (или последующее) промежуточное ПО

Из этого не совсем ясно, приведет ли более высокое значение кпромежуточное программное обеспечение выполняется первым или наоборот.

Например,

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

Вопрос:

  1. Что из этого будет выполнено первым?Мое испытание говорит, что MW2 будет первым.
  2. Какой допустимый диапазон для заказов?0 - 999?

Ответы [ 2 ]

8 голосов
/ 29 сентября 2011

Я знаю, что на этот вопрос ответили, но на самом деле это более сложная вещь - запросы и ответы обрабатываются в обратном порядке.

вы можете думать об этом так:

  • 0 - двигатель делает запрос
  • 1..inf - вызовы промежуточного программного обеспечения process_request
  • inf - происходит фактическая загрузка (если промежуточное ПО запроса не обработало его)
  • инф..1 - вызовы промежуточного программного обеспечения process_resonse
  • 0 - ответ, полученный двигателем

итак ... если я помечу свое промежуточное программное обеспечение как номер 1, это будет промежуточное программное обеспечение FIRST-запроса и промежуточное программное обеспечение LAST-ответа ... если мое промежуточное программное обеспечение как 901 будет выполнено промежуточное программное обеспечение LAST-запроса и промежуточное программное обеспечение FIRST-ответа выполняется (если определено только промежуточное ПО по умолчанию).

на самом деле ответ в том, что это сбивает с толку. начало запроса ближе всего к двигателю (в нуле), а конец запроса ближе всего к загрузчику (большое число). начало ответа является ближайшим к загрузчику (большое число), а конец ответа находится ближе всего к двигателю (в нуле). это как отключение и возврат из движка ... вот соответствующий код из 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)

Как видите, методы запроса добавляются в отсортированном порядке (большее число добавляется сзади), а методы ответа и исключения вставляются в начале (большее число идет первым).

3 голосов
/ 10 июля 2011
  1. Что из этого будет выполнено первым?В моем исследовании говорится, что MW2 будет первым.

Когда вы цитировали документы:

, первое промежуточное ПО - это то, что ближе к двигателю, а последнее -тот, что ближе к загрузчику.

Итак, загрузчик промежуточное ПО со значением 542 выполняется перед промежуточным ПО со значением 543. Это означает, что сначала myproject.middlewares.MW1.process_request(request, spider)вызывается, и после того, как он изменил (при необходимости) запрос, он передается следующему промежуточному программному обеспечению загрузчика.

  1. Какой допустимый диапазон для заказов?0 - 999?

Значение является целым числом.

ОБНОВЛЕНИЕ:

Посмотрите на архитектуру .

Кроме того, полная цитата :

Параметр DOWNLOADER_MIDDLEWARES объединяется с параметром DOWNLOADER_MIDDLEWARES_BASE, определенным в Scrapy (и не предназначенным для переопределения), а затем отсортировано по порядку , чтобы получить окончательный отсортированный список включенных промежуточных программ: первое промежуточное ПО ближе к движку, а последнее ближе к загрузчику.

Итак,поскольку значения являются целыми числами, они имеют диапазон целых чисел Python.

...