我花了几个小时试图解决我在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
这令人困惑。不确定问题究竟是什么。
答案 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