"""Middleware for django_tomselect to manage request objects."""__all__=["TomSelectMiddleware","get_current_request",]try:fromasgiref.localimportLocalaslocal# noqa: N813exceptImportError:fromthreadingimportlocalfromdjango.httpimportHttpRequestfromdjango_tomselect.loggingimportget_loggerlogger=get_logger(__name__)# Create a single local instance for storing request_request_local=local()
[docs]defget_current_request()->HttpRequest|None:"""Get the current request from thread/async-local storage."""returngetattr(_request_local,"request",None)
[docs]classTomSelectMiddleware:"""Stores the request object in thread/async-local storage. Compatible with both WSGI and ASGI deployments. """
[docs]def__init__(self,get_response):"""Initialize the middleware with the get_response callable."""self.get_response=get_response
[docs]def__call__(self,request):"""Handle sync requests in WSGI deployments."""# Store request in local storage_request_local.request=requesttry:response=self.get_response(request)logger.debug("Request object stored in local storage.")returnresponsefinally:# Always clean up the local storageifhasattr(_request_local,"request"):del_request_local.request
[docs]asyncdef__acall__(self,request):"""Handle async requests in ASGI deployments."""# Store request in local storage_request_local.request=requesttry:response=awaitself.get_response(request)logger.debug("Request object stored in local storage.")returnresponsefinally:# Always clean up the local storageifhasattr(_request_local,"request"):del_request_local.request