1+ from contextlib import contextmanager
2+
3+ from asgiref .sync import iscoroutinefunction
4+ from django .utils .decorators import sync_and_async_middleware
5+
16from .models import HistoricalRecords
27
38
4- class HistoryRequestMiddleware :
9+ @contextmanager
10+ def _context_manager (request ):
11+ HistoricalRecords .context .request = request
12+
13+ try :
14+ yield None
15+ finally :
16+ del HistoricalRecords .context .request
17+
18+
19+ @sync_and_async_middleware
20+ def HistoryRequestMiddleware (get_response ):
521 """Expose request to HistoricalRecords.
622
723 This middleware sets request as a local context/thread variable, making it
824 available to the model-level utilities to allow tracking of the authenticated user
925 making a change.
1026 """
1127
12- def __init__ (self , get_response ):
13- self .get_response = get_response
14-
15- def __call__ (self , request ):
16- HistoricalRecords .context .request = request
17- try :
18- response = self .get_response (request )
19- except Exception as e :
20- raise e
21- finally :
22- del HistoricalRecords .context .request
23- return response
28+ if iscoroutinefunction (get_response ):
29+
30+ async def middleware (request ):
31+ with _context_manager (request ):
32+ return await get_response (request )
33+
34+ else :
35+
36+ def middleware (request ):
37+ with _context_manager (request ):
38+ return get_response (request )
39+
40+ return middleware
0 commit comments