Skip to content

context

context

Route context for API request configuration.

This module provides the RouteContext dataclass for consolidating debug and session parameters across route functions.

RouteContext dataclass

RouteContext(
    session: AsyncClient | None = None,
    debug_num_stacks_to_drop: int = 1,
    parent_class: str | None = None,
    log_level: str | None = None,
    debug_api: bool = False,
    dry_run: bool = False,
    is_follow_redirects: bool = True,
    reuse_session: bool = True,
    cache_responses: bool = False,
    invalidate_cache: bool = False,
    is_verify: bool = False,
    cache_config: dict | None = None,
    logger: Any = None,
    is_log_client: bool | None = None,
    is_log_route: bool | None = None,
    is_log_class: bool | None = None,
)

Context object for route function execution.

Consolidates debugging, session, and cache control parameters that are commonly passed to route functions and get_data calls.

Attributes:

Name Type Description
session AsyncClient | None

Optional httpx client session for connection reuse

debug_api bool

Enable detailed API request/response logging

debug_num_stacks_to_drop int

Number of stack frames to drop in debug output

parent_class str | None

Optional parent class name for debugging context

log_level str | None

Optional log level for the request

dry_run bool

If True, return request parameters without executing the API call

is_follow_redirects bool

Follow HTTP redirects (default: True)

reuse_session bool

Reuse one pooled httpx session per auth so TCP/TLS handshakes are amortized across many calls (default: True). Safe — httpx connection pools are concurrency-safe.

cache_responses bool

Cache GET responses (and invalidate on writes) so multi-step reads don't re-fetch the same request (default: False). Opt-in: heuristic URL invalidation can serve stale reads in write-heavy flows, so it is off unless you know your reads repeat.

invalidate_cache bool

Invalidate cache before this request (default: False)

is_verify bool

SSL certificate verification (default: False)

cache_config dict | None

Optional cache configuration dict

is_log_client bool | None

When False, suppress log_call output for client layer (get_data, get_data_stream). None = do not override.

is_log_route bool | None

When False, suppress log_call output for route layer. None = do not override.

is_log_class bool | None

When False, suppress log_call output for class layer. None = do not override.

build_context classmethod

build_context(
    context: RouteContext | None = None, **kwargs
) -> RouteContext

Build RouteContext from either existing context or individual parameters.

This helper allows route functions to accept either a pre-built context or individual parameters, enabling clean signatures.

Parameters:

Name Type Description Default
context RouteContext | None

Optional pre-built RouteContext

None
**kwargs

Individual context parameters (session, debug_api, debug_num_stacks_to_drop, parent_class, log_level, dry_run)

{}

Returns:

Type Description
RouteContext

RouteContext built from provided parameters

Example
In a route function

def my_route(auth, , context=None, context_kwargs): ... context = build_context(context, *context_kwargs) ... res = await get_data(auth=auth, url=url, context=context)

Source code in src/crew_dcs/client/context.py
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
@classmethod
def build_context(
    cls,
    context: RouteContext | None = None,
    **kwargs,
) -> RouteContext:
    """Build RouteContext from either existing context or individual parameters.

    This helper allows route functions to accept either a pre-built context
    or individual parameters, enabling clean signatures.

    Args:
        context: Optional pre-built RouteContext
        **kwargs: Individual context parameters (session, debug_api, debug_num_stacks_to_drop,
                parent_class, log_level, dry_run)

    Returns:
        RouteContext built from provided parameters

    Example:
        >>> # In a route function
        >>> def my_route(auth, *, context=None, **context_kwargs):
        ...     context = build_context(context, **context_kwargs)
        ...     res = await get_data(auth=auth, url=url, context=context)
    """
    # Copy an existing context rather than mutating it in place. Mutating a
    # caller's shared context poisoned it across multi-call flows: a
    # temporary session stamped here (e.g. inside looper) would later be
    # closed, breaking every subsequent request that reused the same context
    # ("Cannot send a request, as the client has been closed" — issue #1464).
    context = RouteContext() if context is None else replace(context)

    # Update context attributes from kwargs if provided
    # For boolean values, allow False to be set explicitly
    for key, value in kwargs.items():
        if hasattr(context, key) and value is not None:
            setattr(context, key, value)

    return context