Django üzerinde kullanıcıların IP adreslerine göre zaman dilimlerini değiştirmek kullanıcının bölgesine göre doğru düzgün zamanları göstermek isteyenler aşağıdaki kod parçasını kullanabilirler.
import ipaddress
from django.contrib.gis.geoip2 import GeoIP2
from django.utils.deprecation import MiddlewareMixin
def get_client_ip(request):
x_forwarded_for = request.META.get("HTTP_X_FORWARDED_FOR")
if x_forwarded_for:
ip = x_forwarded_for.split(",")[0]
elif len(request.META.get("REMOTE_ADDR")) > 6:
ip = request.META.get("REMOTE_ADDR")
elif len(request.META.get("CF-Connecting-IP")) > 6:
ip = request.META.get("CF-Connecting-IP")
return ip
def is_valid_ip(ip_address):
try:
ip = ipaddress.ip_address(ip_address)
return True
except ValueError as e:
return False
def is_local_ip(ip_address):
try:
ip = ipaddress.ip_address(ip_address)
return ip.is_loopback
except ValueError as e:
return None
class IPtoTimezoneMiddleware(MiddlewareMixin):
def process_request(self, request):
tz = request.session.get('django_timezone')
if not tz:
tz = timezone.get_default_timezone()
client_ip = get_client_ip(request)
ip_addrs = client_ip.split(',')
for ip in ip_addrs:
if is_valid_ip(ip) and not is_local_ip(ip):
if ip:
tz = GeoIP2().city(str(ip))['time_zone']
break
if tz:
timezone.activate(tz)
Users.objects.filter(id=request.user.id).update(timezone=str(tz))
request.session['django_timezone'] = str(tz)
else:
timezone.deactivate()