Plain is headed towards 1.0! Subscribe for development updates →

 1from opentelemetry import trace
 2from opentelemetry.semconv._incubating.attributes.user_attributes import USER_ID
 3
 4from plain import auth
 5from plain.exceptions import ImproperlyConfigured
 6from plain.utils.functional import SimpleLazyObject
 7
 8
 9def get_user(request):
10    if not hasattr(request, "_cached_user"):
11        request._cached_user = auth.get_user(request)
12        if request._cached_user:
13            trace.get_current_span().set_attribute(USER_ID, request._cached_user.id)
14    return request._cached_user
15
16
17class AuthenticationMiddleware:
18    def __init__(self, get_response):
19        self.get_response = get_response
20
21    def __call__(self, request):
22        if not hasattr(request, "session"):
23            raise ImproperlyConfigured(
24                "The Plain authentication middleware requires session "
25                "middleware to be installed. Edit your MIDDLEWARE setting to "
26                "insert "
27                "'plain.sessions.middleware.SessionMiddleware' before "
28                "'plain.auth.middleware.AuthenticationMiddleware'."
29            )
30
31        request.user = SimpleLazyObject(lambda: get_user(request))
32
33        return self.get_response(request)