django-auditlog/auditlog/middleware.py
2022-08-17 13:37:22 +02:00

34 lines
1.1 KiB
Python

import contextlib
from auditlog.context import set_actor
class AuditlogMiddleware:
"""
Middleware to couple the request's user to log items. This is accomplished by currying the
signal receiver with the user from the request (or None if the user is not authenticated).
"""
def __init__(self, get_response=None):
self.get_response = get_response
@staticmethod
def _get_remote_addr(request):
if request.headers.get("X-Forwarded-For"):
# In case of proxy, set 'original' address
remote_addr = request.headers.get("X-Forwarded-For").split(",")[0]
# Remove port number from remote_addr
return remote_addr.split(":")[0]
else:
return request.META.get("REMOTE_ADDR")
def __call__(self, request):
remote_addr = self._get_remote_addr(request)
if hasattr(request, "user") and request.user.is_authenticated:
context = set_actor(actor=request.user, remote_addr=remote_addr)
else:
context = contextlib.nullcontext()
with context:
return self.get_response(request)