Plain is headed towards 1.0! Subscribe for development updates →

 1from __future__ import annotations
 2
 3from typing import TYPE_CHECKING, Any
 4from weakref import WeakKeyDictionary
 5
 6if TYPE_CHECKING:
 7    from plain.http import Request
 8
 9_request_users: WeakKeyDictionary[Request, Any | None] = WeakKeyDictionary()
10
11
12def set_request_user(request: Request, user: Any | None) -> None:
13    """Store the authenticated user for this request."""
14    _request_users[request] = user
15
16
17def get_request_user(request: Request) -> Any | None:
18    """
19    Get the authenticated user for this request, if any.
20
21    Lazily loads the user from the session on first access.
22    """
23    if request not in _request_users:
24        from .sessions import get_user
25
26        user = get_user(request)
27
28        # Don't need to store a bunch of None values
29        if not user:
30            return None
31
32        _request_users[request] = user
33
34    return _request_users[request]