为我的站点设置geoip时出错"GeoIP路径必须是有效的文件或目录"

 心如止水向北飞2012_737 发布于 2023-02-07 13:21

对于我的django应用程序,我试图通过amdin存储登录位置的日志.

我创建了一个中间件并尝试使用"django.contrib.gis.utils import GeoIP"来获取地理位置的纬度和经度值.

但得到的错误如下:

/ admin /的GeoIPException

GeoIP路径必须是有效的文件或目录.

代码:trackware.py

from django.contrib.gis.utils import GeoIP
from core.models import Log # your simple Log model

def get_ip(request):
   xff = request.META.get('HTTP_X_FORWARDED_FOR')
   if xff:
      return xff.split(',')[0]
   return request.META.get('REMOTE_ADDR')

class UserLocationLoggerMiddleware(object):

    def process_request(self, request):
        if request.user and request.user.is_superuser:
            # Only log requests for superusers,
            # you can control this by adding a setting
            # to track other user types
            ip = get_ip(request)
            g = GeoIP()
            lat,long = g.lat_lon(ip)
            Log.objects.create(request.user, ip, lat, long)

我在settings.py中所做的更改:

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',

#custom middleware
    'smartDNA.trackware.UserLocationLoggerMiddleware',
)

BASE_DIR = os.path.abspath(os.path.dirname(__file__))
GEOIP_PATH =os.path.join(BASE_DIR, 'geoip')

models.py:

class Log(models.Model):
    user = models.CharField(verbose_name="User",max_length=32)
    ip=models.IPAddressField(verbose_name="IP")
    lat= models.DecimalField(verbose_name="Lat",max_digits=10,decimal_places=1)
    long= models.DecimalField(verbose_name="Long",max_digits=10,decimal_places=1)

admin.py中注册模型:

admin.site.register(Log)

我正在做的错误和解决方案是什么......

2 个回答
  • 从文档中:

    为了执行基于IP的地理定位,GeoIP对象需要GeoIP C库以及二进制格式的GeoIP国家或城市数据集(CSV文件将无法使用!)。这些数据集可以从MaxMind下载。抓取GeoLiteCountry / GeoIP.dat.gz和GeoLiteCity.dat.gz文件,并将其解压缩到与您在设置中设置GEOIP_PATH对应的目录中。

    确保已完成上述操作,否则系统不知道如何将IP映射到位置。

    2023-02-07 13:24 回答
  • 我遇到了同样的问题,我用这种方式解决了它:

    这是我的项目..

    > root
        > app
            settings.py
            urls.py
            ...
        > static
        > application
        > templates
        manage.py
    

    1)下载GeoLiteCountry和GeoLiteCity.dat.gz

    2)在root中创建一个名为的文件夹geoip并将两个文件放在里面. 确保两个文件都重命名为GeoIPCity.dat和GeoIP.dat

    3)在设置文件中指定路径 GEOIP_PATH = os.path.join(BASE_DIR, 'geoip')

    4)做一个测试

    python manage.py shell
    >>> from django.contrib.gis.geoip import GeoIP
    >>> g = GeoIP()
    >>> g.city('72.14.207.99')
    ..
    

    如果它仍然无法工作,请查看g实例以找出指向位置:

    >>> print g._city_file
    /home/foo/root/geoip/GeoIPCity.dat
    >>> print g._country_file
    /home/foo/root/geoip/GeoIP.dat
    

    *如果你得到一个空字符串,试着找到bug.不要尝试通过修改实例重新分配路径g._city_file=/home/foo/Desktop/GeoIP.0.dat,它将无法正常工作!

    2023-02-07 13:24 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有