2011-07-08 22 views
5

Scrapy documentation nói:Scrapy middleware để

các middleware đầu tiên là một trong những gần gũi hơn với động cơ và cuối cùng là một trong những gần gũi hơn đến downloader.

Để quyết định để gán cho middleware bạn thấy các thiết lập DOWNLOADER_MIDDLEWARES_BASE và chọn một giá trị theo nơi bạn muốn chèn các middleware. Trình tự không thành vấn đề bởi vì mỗi middleware thực hiện một hành động khác nhau và middleware của bạn có thể phụ thuộc vào một số trước (hoặc sau) middleware được áp dụng

Tôi không hoàn toàn rõ ràng từ này cho dù giá trị cao hơn sẽ kết quả là một phần mềm trung gian được thực hiện trước hoặc ngược lại.

Ví dụ:

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

Câu hỏi:

  1. nào sau đây sẽ được thực hiện đầu tiên? Thử nghiệm của tôi nói rằng MW2 sẽ là đầu tiên.
  2. Phạm vi hợp lệ cho các đơn đặt hàng là gì? 0 - 999?

Trả lời

4
  1. Điều nào trong số này sẽ được thực hiện trước? Thử nghiệm của tôi nói rằng MW2 sẽ là đầu tiên.

Như bạn trích dẫn các tài liệu:

các middleware đầu tiên là một trong những gần gũi hơn với động cơ và cuối cùng là một trong những gần gũi hơn với các downloader.

Vì vậy downloader middleware với giá trị 542 được thực hiện trước khi các middleware với giá trị 543. Nó có nghĩa là đầu tiên myproject.middlewares.MW1.process_request(request, spider) được gọi, và sau đó thay đổi (nếu cần) theo yêu cầu, nó sẽ được chuyển cho các downloader middleware tiếp theo .

  1. Phạm vi hợp lệ cho các đơn đặt hàng là gì? 0 - 999?

Giá trị là số nguyên.

UPDATE:

Nhìn vào architecture.

Ngoài ra, đầy đủ quote:

Thiết lập DOWNLOADER_MIDDLEWARES được sáp nhập với các thiết lập DOWNLOADER_MIDDLEWARES_BASE quy định tại Scrapy (và không có nghĩa để được ghi đè) và sau đó được sắp xếp theo thứ tự để có được trận chung kết sắp xếp danh sách các phần mềm trung gian được bật: phần mềm trung gian đầu tiên là phần gần nhất với động cơ và động cơ cuối cùng là thiết bị gần gũi hơn với trình tải xuống.

Vì vậy, vì giá trị là số nguyên, chúng có phạm vi số nguyên Python.

+0

Làm thế nào để bạn kết luận rằng thiết bị gần gũi hơn với động cơ là 542? Đối với câu hỏi thứ hai, tôi có nghĩa là để hỏi phạm vi, là nó 0 đến 999 hoặc bất kỳ số nguyên? – Medorator

+0

xem bản cập nhật. – warvariuc

5

Tôi biết điều này đã được trả lời, nhưng thực sự nó là một điều phức tạp hơn - yêu cầu và phản hồi được xử lý theo thứ tự ngược lại.

bạn có thể nghĩ về nó như thế này:

  • 0 - động cơ làm cho yêu cầu
  • 1..inf - middleware process_request gọi
  • inf - tải xuống thực tế xảy ra (nếu một middleware yêu cầu không xử lý nó)
  • inf..1 - process_resonse middleware gọi
  • 0 - phản ứng nhận được bởi các công cụ

vì vậy ... nếu tôi gắn thẻ phần mềm trung gian của tôi làm số 1 thì nó sẽ là phần mềm trung gian yêu cầu đầu tiên được thực thi và phần mềm trung gian phản hồi LAST được thực hiện ... nếu phần mềm trung gian của tôi là 901, nó sẽ là phần mềm trung gian yêu cầu LAST và phần mềm trung gian phản hồi FIRST được thực hiện (nếu chỉ định nghĩa phần mềm trung gian mặc định).

thực sự câu trả lời là nó gây nhầm lẫn. sự khởi đầu của yêu cầu là gần nhất động cơ (ở số không) và kết thúc của yêu cầu là gần nhất downloader (số cao). sự bắt đầu của đáp ứng là gần nhất của downloader (số cao) và kết thúc của phản ứng là gần nhất động cơ (ở số không). nó giống như một chuyến đi ra ngoài và trở lại từ động cơ ... đây là các mã có liên quan từ scrapy mà làm tất cả điều này rất thú vị (với init sao chép từ MiddlewareManager để tham khảo và chỉ có phương pháp có liên quan bao gồm):

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) 

Như bạn có thể thấy, các phương thức yêu cầu được thêm vào thứ tự sắp xếp (số cao hơn được thêm vào phía sau) và các phương thức trả lời và ngoại lệ được chèn vào đầu (số cao hơn là trước).

Các vấn đề liên quan