0

我花了几个小时试图解决我在 Django 中设置 GeoIP 的问题,但无济于事,并希望获得一些关于问题可能是什么的指导。

我正在开发一个现有的 Django 应用程序,该应用程序需要一些地理定位能力,特别是获取用户 IP 和纬度/经度,然后将该信息放在地图标记上。GeoIP 和相关库似乎是第一步的最佳解决方案。

我使用 Homebrew 在 Mac 上安装了 GeoIP。然后,我使用 GeoIPv6.data 和 GeoLiteCity.dat 文件在我的项目的根目录中手动创建了一个文件夹。在此之后,我在我的设置文件中添加了路径:

import os

DEBUG = True
TEMPLATE_DEBUG = DEBUG

BASE_DIR = os.path.dirname(os.path.abspath(__file__))

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

然后我为该项目打开了一个命令外壳并收到以下错误:

>>> from django.contrib.gis.geoip import GeoIP
Traceback (most recent call last):
  File "<console>", line 1, in <module>
ImportError: No module named geoip

我似乎无法解决这个问题。一个可能的问题是提取两个 dat.gz 文件是一个问题。两者都不能从命令行解压缩 - .zip 文件也不能 - 并且必须使用 Stuffit Expander 来打开这些文件。我的项目 IDE (pyCharm) 中生成的 dat 文件在每个文件上都有一个 VLC (?) 图标。也许这是问题的一部分(找到解压缩文件的方法本身就是一个挑战)。我不确定,因为甚至没有找到该模块。

任何帮助都将非常感谢解决此问题,因为如果不找出问题所在,我将无法取得进一步进展。

非常感谢。

*编辑。好的,它首先出现了一个不正确的导入语句可能是问题所在。修复它:从 django.contrib.gis.utils.geoip 导入 GeoIP。不幸的是,一旦修复,以下错误结果:

>>> from django.contrib.gis.utils.geoip import GeoIP
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/contrib/gis/utils/geoip.py", line 68, in <module>
    lgeoip = CDLL(lib_path)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypes/__init__.py", line 353, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: dlopen(/usr/local/lib/libGeoIP.dylib, 6): no suitable image found.  Did find:
        /usr/local/lib/libGeoIP.dylib: mach-o, but wrong architecture

这令人困惑。不确定到底是什么问题。

4

4 回答 4

1

拱不匹配消息意味着libgeoIP您安装的库是使用与运行 Python 解释器的架构不同的 CPU 架构构建的。从所涉及的路径来看,您似乎使用的是更新的(非 Apple 提供的)Python 2.7。有可能libgeoIP是 64 位 ( -arch x86_64) 而您安装的 Python 是仅 32 位的 Python 2.7 ( -arch i386)。或者可能反过来。无论哪种情况,您都可以尝试使用该universal选项重新安装 GeoIP,使其包含两个拱门。或者您可以尝试使用 64 位/32 位版本(例如可从 python.org 下载)重新安装 Python 2.7。您可以使用以下file命令确定涉及哪些拱门:

$ file /usr/local/lib/libGeoIP.dylib
$ file $(python2.7 -c 'import sys;print(sys.executable)')

两者之间至少需要一种通用架构。

于 2012-05-25T01:59:00.220 回答
1

在 Django 1.4 及更高版本(包括当前的 1.9 版本)上导入 GeoIP 的正确方法是:

from django.contrib.gis.geoip import GeoIP
于 2015-12-03T16:01:04.153 回答
0

这不是您的 dat 文件的问题。它的导入语句有问题,它找到了 GeoIP 模块。

来自文档:
https ://docs.djangoproject.com/en/1.4/ref/contrib/gis/geoip/

在 Django 1.4 中,GeoIP 对象被移出 django.contrib.gis.utils 并移到它自己的模块 django.contrib.gis.geoip 中。utils 中仍提供快捷方式,但将在 Django 1.6 中删除。

如果您使用的是 django 1.3.x,请尝试:

from django.contrib.gis.utils import GeoIP

注意这两个版本之间导入路径的区别:
https ://docs.djangoproject.com/en/1.3/ref/contrib/gis/geoip/
https://docs.djangoproject.com/en/1.4/ref/贡献/gis/geoip/

于 2012-05-24T23:19:14.260 回答
0
Previously i was facing this issue : from django.contrib.gis.geoip import GeoIP ImportError: cannot import name GeoIP

解决方案 :

yum install GeoIP-devel -y
于 2016-11-11T06:56:47.903 回答