繁体   English   中英

找不到Django GeoIP模块

[英]Django GeoIP Module Not Found

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

我正在研究一个现有的Django应用程序,它需要一些地理定位能力,特别是获取用户IP和lat / long,然后将这些信息放在地图标记上。 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

这很令人困惑。 不确定问题究竟是什么。

arch不匹配消息意味着您安装的libgeoIP库使用与运行Python解释器的体系结构不同的CPU体系结构构建。从所涉及的路径,您似乎使用较新的(非Apple提供的)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命令确定涉及哪些arch:

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

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

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

from django.contrib.gis.geoip import GeoIP

它不是您的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/

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

方案:

yum install GeoIP-devel -y

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM