2022-01-10
Django middleware example
my use case: get latest visiting time from a user, not a login time
/profiles/models.py
class User(AbstractUser):
last_visit = models.DateTimeField(auto_now_add=True, blank=True, null=True)
...
/projectname/middleware.py
from django.utils import timezone
from profiles.models import User
from datetime import timedelta
# https://docs.djangoproject.com/en/dev/topics/http/middleware/#writing-your-own-middleware
class LastVisitMiddleware:
def __init__(self, get_response):
# One-time configuration and initialization.
self.get_response = get_response
def __call__(self, request):
# Code to be executed for each request before
# the view (and later middleware) are called.
response = self.get_response(request)
# Code to be executed for each request/response after
# the view is called.
if request.user.is_authenticated:
try:
last_visit = User.objects.get(pk=request.user.pk).last_visit
if last_visit + timedelta(minutes=1) < timezone.now():
User.objects.filter(pk=request.user.pk).update(
last_visit=timezone.now()
)
except User.DoesNotExist:
pass
return response
/settings.py
MIDDLEWARE = [
...
...
"projectname.middleware.LastVisitMiddleware",
]