@@ -192,6 +192,17 @@ def __init__(self, crawler):
192192 else :
193193 self ._checker = None
194194
195+ self ._enabled = crawler .settings .getbool ("ZYTE_API_SESSION_ENABLED" , False )
196+
197+ def enabled (self , request : Request ) -> bool :
198+ """Return ``True`` if the request should use sessions from
199+ :ref:`session management <session>` or ``False`` otherwise.
200+
201+ The default implementation is based on settings and request metadata
202+ keys as described in :ref:`enable-sessions`.
203+ """
204+ return request .meta .get ("zyte_api_session_enabled" , self ._enabled )
205+
195206 def pool (self , request : Request ) -> str :
196207 """Return the ID of the session pool to use for *request*.
197208
@@ -202,7 +213,9 @@ def pool(self, request: Request) -> str:
202213 https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html.
203214
204215 scrapy-zyte-api can maintain multiple session pools, each pool with up
205- to :setting:`ZYTE_API_SESSION_POOL_SIZE` sessions.
216+ to :setting:`ZYTE_API_SESSION_POOL_SIZE` sessions
217+ (:setting:`ZYTE_API_SESSION_POOL_SIZES` allows configuring
218+ pool-specific sizes).
206219 """
207220 return urlparse_cached (request ).netloc
208221
@@ -655,7 +668,11 @@ async def check(self, response: Response, request: Request) -> bool:
655668 """Check the response for signs of session expiration, update the
656669 internal session pool accordingly, and return ``False`` if the session
657670 has expired or ``True`` if the session passed validation."""
671+ if self .is_init_request (request ):
672+ return True
658673 session_config = self ._get_session_config (request )
674+ if not session_config .enabled (request ):
675+ return True
659676 pool = self ._get_pool (request )
660677 try :
661678 passed = session_config .check (response , request )
@@ -681,6 +698,12 @@ async def check(self, response: Response, request: Request) -> bool:
681698
682699 async def assign (self , request : Request ):
683700 """Assign a working session to *request*."""
701+ if self .is_init_request (request ):
702+ return
703+ session_config = self ._get_session_config (request )
704+ if not session_config .enabled (request ):
705+ self ._crawler .stats .inc_value ("scrapy-zyte-api/sessions/use/disabled" )
706+ return
684707 session_id = await self ._next (request )
685708 # Note: If there is a session set already (e.g. a request being
686709 # retried), it is overridden.
@@ -702,6 +725,10 @@ async def assign(self, request: Request):
702725 request .meta [meta_key ]["session" ] = {"id" : session_id }
703726 request .meta .setdefault ("dont_merge_cookies" , True )
704727
728+ def is_enabled (self , request : Request ) -> bool :
729+ session_config = self ._get_session_config (request )
730+ return session_config .enabled (request )
731+
705732 def handle_error (self , request : Request ):
706733 pool = self ._get_pool (request )
707734 self ._crawler .stats .inc_value (
@@ -755,27 +782,18 @@ def from_crawler(cls, crawler: Crawler):
755782 return cls (crawler )
756783
757784 def __init__ (self , crawler : Crawler ):
758- self ._enabled = crawler .settings .getbool ("ZYTE_API_SESSION_ENABLED" , False )
759785 self ._crawler = crawler
760786 self ._sessions = _SessionManager (crawler )
761787 self ._fatal_error_handler = FatalErrorHandler (crawler )
762788
763789 async def process_request (self , request : Request , spider : Spider ) -> None :
764- if not request .meta .get (
765- "zyte_api_session_enabled" , self ._enabled
766- ) or self ._sessions .is_init_request (request ):
767- return
768790 async with self ._fatal_error_handler :
769791 await self ._sessions .assign (request )
770792
771793 async def process_response (
772794 self , request : Request , response : Response , spider : Spider
773795 ) -> Union [Request , Response , None ]:
774- if (
775- isinstance (response , DummyResponse )
776- or not request .meta .get ("zyte_api_session_enabled" , self ._enabled )
777- or self ._sessions .is_init_request (request )
778- ):
796+ if isinstance (response , DummyResponse ):
779797 return response
780798 async with self ._fatal_error_handler :
781799 passed = await self ._sessions .check (response , request )
@@ -795,8 +813,8 @@ async def process_exception(
795813 ) -> Union [Request , None ]:
796814 if (
797815 not isinstance (exception , RequestError )
798- or not request .meta .get ("zyte_api_session_enabled" , self ._enabled )
799816 or self ._sessions .is_init_request (request )
817+ or not self ._sessions .is_enabled (request )
800818 ):
801819 return None
802820
0 commit comments