如何使用 GeoIP2() django 模型从 IP 地址调用中提取保存的信息以显示在我的 html 中

Posted

技术标签:

【中文标题】如何使用 GeoIP2() django 模型从 IP 地址调用中提取保存的信息以显示在我的 html 中【英文标题】:How to pull information saved from IP address call with GeoIP2() django models to display in my html 【发布时间】:2018-07-28 15:46:33 【问题描述】:

我已经创建了获取 IP 地址并将来自 city_data 的信息存储在 GeoIP2() 中的函数。我希望能够从 city_data 中获取纬度和经度并将其显示在我的 html 页面中。

我似乎遇到的问题是我无法调用保存在用户会话模型中的任何信息。当我查看管理员以及打印查询集时,信息就在那里

在模型中,我使用 usersession/usersessionmanager 创建一个新会话,并将该会话与接收者一样保存

模型.py

from django.conf import settings
from django.db import models
 
from .signals import user_logged_in
from .utils import get_client_city_data, get_client_ip


class UserSessionManager(models.Manager):
    def create_new(self, user, session_key=None, ip_address=None, city_data=None, latitude=None, longitude=None):
        session_new = self.model()
        session_new.user = user
        session_new.session_key = session_key
        if ip_address is not None:
            session_new.ip_address = ip_address
            if city_data:
                session_new.city_data = city_data
                try:
                    city = city_data['city']
                except:
                    city = None
                session_new.city = city
                try:
                    country = city_data['country_name']
                except:
                    country = None
                try:
                    latitude= city_data['latitude']
                except:
                    latitude = None
                try:
                    longitude= city_data['longitude']
                except:
                    longitude = None

            session_new.country = country
            session_new.latitude = latitude
            session_new.longitude = longitude
            session_new.save()
            return session_new
        return None


class UserSession(models.Model):
    user            = models.ForeignKey(settings.AUTH_USER_MODEL)
    session_key     = models.CharField(max_length=60, null=True, blank=True)
    ip_address      = models.GenericIPAddressField(null=True, blank=True)
    city_data       = models.TextField(null=True, blank=True)
    city            = models.CharField(max_length=120, null=True, blank=True)
    country         = models.CharField(max_length=120, null=True, blank=True)
    latitude        = models.FloatField(null=True, blank=True)
    longitude       = models.FloatField(null=True, blank=True)
    active          = models.BooleanField(default=True)
    timestamp       = models.DateTimeField(auto_now_add=True)

    objects = UserSessionManager()

    def __str__(self):
        city = self.city
        country = self.country
        latitude = self.latitude
        longitude = self.longitude
        if city and country and latitude and longitude:
            return f"city, country, latitude, longitude"
        elif city and not country and not latitude and longitude:
            return f"city"
        elif country and not city and not latitude and longitude:
            return f"country"

        return self.user.username


def user_logged_in_receiver(sender, request, *args, **kwargs,):
    user = sender
    ip_address = get_client_ip(request)
    city_data = get_client_city_data(ip_address)
    request.session['CITY'] = str(city_data.get('city', 'New York'))
    # request.session['LAT_LON'] = str(lat_lon.get('latitude','longitude'))
    session_key = request.session.session_key
    UserSession.objects.create_new(
                user=user,
                session_key=session_key,
                ip_address=ip_address,
                city_data=city_data,
                )



user_logged_in.connect(user_logged_in_receiver)

在这里我调用 IP 地址以及它使用 GEoIP2 存储的 city_data

Utils.py

from django.conf import settings
from django.contrib.gis.geoip2 import GeoIP2

GEO_DEFAULT_IP = getattr(settings, 'GEO_DEFAULT_IP', '72.14.207.99')

def get_client_ip(request):
    x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
    if x_forwarded_for is not None:
        ip = x_forwarded_for.split(',')[0]
    else:
        ip = request.META.get('REMOTE_ADDR')
    ip_address = ip or GEO_DEFAULT_IP
    if str(ip_address) == '127.0.0.1':
        ip_address = GEO_DEFAULT_IP
    return ip_address


def get_client_city_data(ip_address):
    g = GeoIP2()
    try:
        return g.city(ip_address)
    except:
        return None

在这里,我为具有我测试的查询集的页面创建了一个视图,以查看数据是否存在

观看次数

from django.shortcuts import render
from django.views.generic import TemplateView
from .models import UserSession, UserSessionManager

class LatlonView(TemplateView):
    model = UserSession
    template_name = 'analytics/latlon.html'

    def get(self, request):
        usersession = UserSession.objects.all()
        print (usersession)
        return usersession

我的假设是,问题出在这我相信这是因为我可能调用了错误的东西,但我已经尝试了我能想到的每一个调用,但无法获得正确的配置来显示任何数据

HTML

<!DOCTYPE html>
<html>
  <head>
    <title>Current Location</title>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no">
    <meta charset="utf-8">

  </head>


  <body>
    % block body %
      <h1> UserSession.city_data </h1>
    <h1> UserSession.latitude </h1>
      <h1> UserSession.longitude </h1>
    <h1>HEllo<h1>
    % endblock %
  </body>

</html>

【问题讨论】:

【参考方案1】:

我相信我已经找到了解决方案。我先贴出代码,在底部解释一下。

views.py

    def get(self, request):
    usersession = UserSession.objects.filter(user =self.request.user)
    args = 'usersessions':usersession
    return render(request, self.template_name, args)

HTML

% for usersession in in usersessions %
whatever material you want to loop through
% endfor %
HMTL 需要知道要使用多少个或哪些 UserSession。因此必须运行一个循环才能获得某种列表 您需要调用列表中的特定对象,因此在views.py 中的函数中,您可以将列表(在本例中我将其设置为usersessionS)设置为args*,然后您可以从中获取特定对象列表以及根据您的模型存储在其中的任何信息。 我还对您的查询进行了过滤,因此您可以将最近的会话作为您的会话。这允许保存的会话是登录的用户,但我怀疑可以根据您的喜好进行修改。

【讨论】:

以上是关于如何使用 GeoIP2() django 模型从 IP 地址调用中提取保存的信息以显示在我的 html 中的主要内容,如果未能解决你的问题,请参考以下文章

带有 uWSGI 的 Django 中 Geoip2() 上的“[Errno 12] 无法分配内存”

Django博客来访人员地域分布大数据可视化---echarts绘图geoip2获取地理位置

Django博客来访人员地域分布大数据可视化---echarts绘图geoip2获取地理位置

如何在生产环境中运行的 Nginx 上安装 Geoip2 模块?

如何修复在 Hive 下运行的 geoip2 java 的“java.lang.NoSuchMethodError”

如何在 Django 中使用 South 将数据从一个模型迁移到另一个模型?