Pazartesi, Aralık 23, 2024

Django’da Ip Adresinden Timezone Ataması Yapmak

yüksek çözünürlüklü django logosu

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()