找不到Django GeoIP模块

时间:2012-05-24 23:05:33

标签: python django geolocation

我花了几个小时试图解决我在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'),

然后我打开了项目的命令shell并收到以下错误:

>>> 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 个答案:

答案 0 :(得分:1)

arch不匹配消息表示您安装的libgeoIP库是使用与运行Python解释器的体系结构不同的CPU体系结构构建的。从所涉及的路径中,您似乎使用的是较新的(非{ - 苹果提供)Python 2.7。有可能libgeoIP被构建为64位(-arch x86_64),而您安装的Python是32位只有Python 2.7(-arch i386)。或者可能相反。在任何一种情况下,您都可以尝试使用universal选项重新安装GeoIP,以便它包含两个拱门。或者您可以尝试使用64位/ 32位版本重新安装Python 2.7,例如可从python.org下载。您可以使用file命令确定涉及哪些拱门:

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

两者之间至少需要有一个共同的架构。

答案 1 :(得分:1)

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

from django.contrib.gis.geoip import GeoIP

答案 2 :(得分:0)

它不是您的dat文件的问题。这是import语句的问题,它找到了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/contrib/gis/geoip/

答案 3 :(得分:0)

Previously i was facing this issue : from django.contrib.gis.geoip import GeoIP ImportError: cannot import name GeoIP

解决方案:

yum install GeoIP-devel -y