Skip to content

Commit 1b626ea

Browse files
committed
Sync and async middleware.
1 parent 2e3e325 commit 1b626ea

File tree

1 file changed

+30
-13
lines changed

1 file changed

+30
-13
lines changed

simple_history/middleware.py

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,40 @@
1+
from contextlib import contextmanager
2+
3+
from asgiref.sync import iscoroutinefunction
4+
from django.utils.decorators import sync_and_async_middleware
5+
16
from .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

Comments
 (0)