import pytz import requests from ipware import get_client_ip from django.utils import timezone # make sure you add `TimezoneMiddleware` appropriately in settings.py: 'apps.RUG_template.middleware.TimezoneMiddleware' class TimezoneMiddleware: """ Middleware to check user timezone. """ def __init__(self, get_response): self.get_response = get_response # One-time configuration and initialization. def __call__(self, request): # Code to be executed for each request before # the view (and later middleware) are called. client_ip, is_routable = get_client_ip(request) user_time_zone = request.session.get('user_time_zone', None) try: if user_time_zone is None and is_routable and client_ip is not None: # Here we use an online service to get visitor info. Maybe not the nicest way to do it, but it is a way # Also we only check when we get a public IP address. Local networks will not be checked online # https://freegeoip.app freegeoip_response = requests.get('https://freegeoip.app/json/{0}'.format(client_ip)) freegeoip_response_json = freegeoip_response.json() user_time_zone = freegeoip_response_json['time_zone'] if user_time_zone: request.session['user_time_zone'] = user_time_zone timezone.activate(pytz.timezone(user_time_zone)) except: pass response = self.get_response(request) # Code to be executed for each request/response after # the view is called. return response