Configure StickyMetaParamsMiddleware from settings

Configure middleware through settings instead of a spider attribute.
This commit is contained in:
Luiz Silva 2019-12-06 13:20:24 -03:00
parent 1432d76f03
commit f89b3dff93
6 changed files with 16 additions and 23 deletions

View File

@ -1383,6 +1383,16 @@ Default: ``[]`` (empty list)
Send Scrapy stats after spiders finish scraping. See
:class:`~scrapy.extensions.statsmailer.StatsMailer` for more info.
.. setting:: STICKY_META_KEYS
STICKY_META_KEYS
----------------
Default: ``[]`` (empty list)
Configure which key/values should be stickied in :attr:`Request.meta`. See
:class:`~scrapy.spidermiddlewares.stickymeta.StickyMetaParamsMiddleware` for more info.
.. setting:: TELNETCONSOLE_ENABLED
TELNETCONSOLE_ENABLED

View File

@ -463,8 +463,7 @@ StickyMetaParamsMiddleware
When enabled and configured, this middleware forwards the desired :ref:`Request.meta <topics-request-meta>`
parameters between ``Requests`` and ``Responses``.
The :class:`StickyMetaParamsMiddleware` can be configured through the :attr:`~scrapy.spiders.Spider.sticky_meta_keys`
spider attribute.
The :class:`StickyMetaParamsMiddleware` can be configured through the settings :setting:`STICKY_META_KEYS`.
See the difference between :ref:`topics-spiders` with and without the middleware:
@ -505,7 +504,7 @@ StickyMetaParamsMiddleware
class StickySpider(Spider):
name = 'sticky'
start_urls = ['https://www.example.com']
sticky_meta_keys = ['param'] # Will always forward the meta param "param"
custom_settings = {'STICKY_META_KEYS': ['param']} # Will always forward the meta param "param"
def parse(self, response):
for param in range(5):

View File

@ -196,13 +196,6 @@ scrapy.Spider
Called when the spider closes. This method provides a shortcut to
signals.connect() for the :signal:`spider_closed` signal.
.. attribute:: sticky_meta_keys
Keys to be stickied in ``meta`` dictionary.
For more information about stickied meta parameters see:
:class:`~scrapy.spidermiddlewares.stickymeta.StickyMetaParamsMiddleware`
Let's see an example::
import scrapy

View File

@ -7,7 +7,7 @@ class StickyMetaParamsMiddleware(object):
@classmethod
def from_crawler(cls, crawler):
keys_to_sticky = getattr(crawler.spider, 'sticky_meta_keys', [])
keys_to_sticky = crawler.settings.get('STICKY_META_KEYS', [])
if not keys_to_sticky:
raise NotConfigured
return cls(keys_to_sticky)

View File

@ -20,7 +20,6 @@ class Spider(object_ref):
name = None
custom_settings = None
sticky_meta_keys = []
def __init__(self, name=None, **kwargs):
if name is not None:

View File

@ -22,21 +22,13 @@ class TestStickyMetaParamsMiddleware(TestCase):
def create_middleware(self, crawler):
return StickyMetaParamsMiddleware.from_crawler(crawler)
def _get_crawler(self, spider):
crawler = get_crawler(Spider)
crawler.spider = spider
return crawler
def test_middleware_not_enabled(self):
spider = Spider('dummy')
crawler = self._get_crawler(spider)
crawler = get_crawler(Spider)
with pytest.raises(NotConfigured):
self.create_middleware(crawler)
def test_sticky_params(self):
spider = Spider('dummy')
spider.sticky_meta_keys = ['param2']
crawler = self._get_crawler(spider)
crawler = get_crawler(Spider, {'STICKY_META_KEYS': ['param2']})
middleware = self.create_middleware(crawler)
request = Request(
self.test_url,
@ -49,7 +41,7 @@ class TestStickyMetaParamsMiddleware(TestCase):
Request(self.test_url),
MockItem(name='dummy')
]
results = middleware.process_spider_output(response, result, spider)
results = middleware.process_spider_output(response, result, None)
for result in results:
if isinstance(result, Request):
self.assertEqual(result.meta, {'param2': 'Stickied!'})