为什么 scrapy middleware 使用 from_crawler 来初始化一个 middleware

2016-02-21 15:19:45 +08:00
 Yc1992

例如:

class CookiesMiddleware(object):
    """This middleware enables working with sites that need cookies"""

    def __init__(self, debug=False):
        self.jars = defaultdict(CookieJar)
        self.debug = debug

    @classmethod
    def from_crawler(cls, crawler):
        if not crawler.settings.getbool('COOKIES_ENABLED'):
            raise NotConfigured
        return cls(crawler.settings.getbool('COOKIES_DEBUG'))

为什么不可以直接在init中使用 crawler 进行初始化呢,这样做有什么好处?

2802 次点击
所在节点    Python
1 条回复
rebornix
2016-02-21 18:07:20 +08:00
你看下初始化 middleware 的代码 https://github.com/scrapy/scrapy/blob/6660175de9abddaf29be2b5f74e3f04a389618bf/scrapy/middleware.py#L33

mwcls = load_object(clspath)
if crawler and hasattr(mwcls, 'from_crawler'):
mw = mwcls.from_crawler(crawler)
elif hasattr(mwcls, 'from_settings'):
mw = mwcls.from_settings(settings)
else:
mw = mwcls()
middlewares.append(mw)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/258005

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX