| 92 | install_scrapy_root_handler(self.settings) |
| 93 | |
| 94 | def _apply_settings(self) -> None: |
| 95 | if self.settings.frozen: |
| 96 | return |
| 97 | |
| 98 | self.addons.load_settings(self.settings) |
| 99 | self.stats = load_object(self.settings["STATS_CLASS"])(self) |
| 100 | |
| 101 | lf_cls: type[LogFormatter] = load_object(self.settings["LOG_FORMATTER"]) |
| 102 | self.logformatter = lf_cls.from_crawler(self) |
| 103 | |
| 104 | self.request_fingerprinter = build_from_crawler( |
| 105 | load_object(self.settings["REQUEST_FINGERPRINTER_CLASS"]), |
| 106 | self, |
| 107 | ) |
| 108 | |
| 109 | use_reactor = self.settings.getbool("TWISTED_REACTOR_ENABLED") |
| 110 | if use_reactor: |
| 111 | # We either install a reactor or expect one to be installed. |
| 112 | reactor_class: str = self.settings["TWISTED_REACTOR"] |
| 113 | event_loop: str = self.settings["ASYNCIO_EVENT_LOOP"] |
| 114 | if self._init_reactor: |
| 115 | # We need to install a reactor. |
| 116 | # This needs to be done after the spider settings are merged, |
| 117 | # but before something imports twisted.internet.reactor. |
| 118 | if reactor_class: |
| 119 | # Install a specific reactor. |
| 120 | install_reactor(reactor_class, event_loop) |
| 121 | else: |
| 122 | # Install the default one. |
| 123 | from twisted.internet import reactor # noqa: F401 |
| 124 | elif not is_reactor_installed(): |
| 125 | # We need a reactor to be already installed. |
| 126 | raise RuntimeError( |
| 127 | "We expected a Twisted reactor to be installed but it isn't." |
| 128 | ) |
| 129 | if reactor_class: |
| 130 | # We need to check that the correct reactor is installed. |
| 131 | verify_installed_reactor(reactor_class) |
| 132 | if is_asyncio_reactor_installed() and event_loop: |
| 133 | verify_installed_asyncio_event_loop(event_loop) |
| 134 | |
| 135 | if self._init_reactor or reactor_class: |
| 136 | log_reactor_info() |
| 137 | else: |
| 138 | # We expect a reactor to not be installed. |
| 139 | if is_reactor_installed(): |
| 140 | raise RuntimeError( |
| 141 | "TWISTED_REACTOR_ENABLED is False but a Twisted reactor is installed." |
| 142 | ) |
| 143 | logger.debug("Not using a Twisted reactor") |
| 144 | self._apply_reactorless_default_settings() |
| 145 | |
| 146 | self.extensions = ExtensionManager.from_crawler(self) |
| 147 | self.settings.freeze() |
| 148 | |
| 149 | d = dict(overridden_settings(self.settings)) |
| 150 | logger.info( |
| 151 | "Overridden settings:\n%(settings)s", {"settings": pprint.pformat(d)} |