Skip to content

Commit 42e81f6

Browse files
authored
Extend the public API of session management (#211)
1 parent cd0aead commit 42e81f6

File tree

4 files changed

+46
-0
lines changed

4 files changed

+46
-0
lines changed

docs/usage/session.rst

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,18 @@ To define a different session config for a given URL pattern, install
338338

339339
.. autofunction:: scrapy_zyte_api.session_config
340340

341+
If in a session config implementation or in any other Scrapy component you need
342+
to tell whether a request is a :ref:`session initialization request
343+
<session-init>` or not, use :func:`~scrapy_zyte_api.is_session_init_request`:
344+
345+
.. autofunction:: scrapy_zyte_api.is_session_init_request
346+
347+
Classes decorated with :func:`~scrapy_zyte_api.session_config` are registered
348+
into :data:`~scrapy_zyte_api.session_config_registry`:
349+
350+
.. autodata:: scrapy_zyte_api.session_config_registry
351+
:annotation:
352+
341353
.. _session-cookies:
342354

343355
Cookie handling

scrapy_zyte_api/__init__.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@
1919
from ._session import (
2020
ScrapyZyteAPISessionDownloaderMiddleware,
2121
SessionConfig,
22+
is_session_init_request,
2223
session_config,
2324
)
25+
from ._session import session_config_registry as _session_config_registry
2426
from .addon import Addon
2527
from .handler import ScrapyZyteAPIDownloadHandler
2628

@@ -37,3 +39,7 @@
3739
#: .. note:: When using python-zyte-api 0.5.2 or lower, this is the same as
3840
#: :data:`~scrapy_zyte_api.SESSION_DEFAULT_RETRY_POLICY`.
3941
SESSION_AGGRESSIVE_RETRY_POLICY = _SESSION_AGGRESSIVE_RETRY_POLICY
42+
43+
#: Instance of :class:`web_poet.rules.RulesRegistry` that holds :ref:`session
44+
#: configs <session-configs>`.
45+
session_config_registry = _session_config_registry

scrapy_zyte_api/_session.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,12 @@
3737
ZYTE_API_META_KEYS = ("zyte_api", "zyte_api_automap", "zyte_api_provider")
3838

3939

40+
def is_session_init_request(request):
41+
"""Return ``True`` if the request is a :ref:`session initialization request
42+
<session-init>` or ``False`` otherwise."""
43+
return request.meta.get(SESSION_INIT_META_KEY, False) is True
44+
45+
4046
class SessionRetryFactory(RetryFactory):
4147
temporary_download_error_stop = stop_after_attempt(1)
4248

@@ -338,6 +344,10 @@ def params(self, request: Request) -> Dict[str, Any]:
338344
"url": "https://example.com/new-session",
339345
"httpResponseBody": True,
340346
}
347+
348+
The returned parameters do not need to include :http:`request:url`. If
349+
missing, it is picked from the request :ref:`triggering a session
350+
initialization request <pool-size>`.
341351
"""
342352
if location := self.location(request):
343353
return {
@@ -358,6 +368,10 @@ def check(self, response: Response, request: Request) -> bool:
358368
359369
The default implementation checks the outcome of the ``setLocation``
360370
action if a location was defined, as described in :ref:`session-check`.
371+
372+
If you need to tell whether *request* is a :ref:`session initialization
373+
request <session-init>` or not, use
374+
:func:`~scrapy_zyte_api.is_session_init_request`.
361375
"""
362376
if self._checker:
363377
return self._checker.check(response, request)

tests/test_sessions.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
SESSION_AGGRESSIVE_RETRY_POLICY,
1818
SESSION_DEFAULT_RETRY_POLICY,
1919
SessionConfig,
20+
is_session_init_request,
2021
session_config,
2122
)
2223
from scrapy_zyte_api._session import SESSION_INIT_META_KEY, session_config_registry
@@ -2649,3 +2650,16 @@ def parse(self, response):
26492650
}
26502651
if reason is not None:
26512652
assert reason in caplog.text
2653+
2654+
2655+
@pytest.mark.parametrize(
2656+
("meta", "expected"),
2657+
(
2658+
({}, False),
2659+
({SESSION_INIT_META_KEY: False}, False),
2660+
({SESSION_INIT_META_KEY: True}, True),
2661+
),
2662+
)
2663+
def test_is_session_init_request(meta, expected):
2664+
actual = is_session_init_request(Request("https://example.com", meta=meta))
2665+
assert expected == actual

0 commit comments

Comments
 (0)