在heroku上运行基于geodjango的应用程序的错误

时间:2012-07-20 08:59:17

标签: django heroku geodjango

问题

我正在尝试将我的geodjango应用程序部署到Heroku。该应用程序运行但当我尝试查看/admin/world/worldborder/the wolrd geodjango tutorial application)或我自己的自定义Spots应用程序(使用geodjango)时,该网站崩溃。

如果我查看我的heroku logs,那么我发现dyno经历了500错误:

2012-07-20T08:16:23+00:00 heroku[router]: GET myapp.herokuapp.com/admin/spots/spot/ dyno=web.1 queue=0 wait=0ms service=654ms status=500 bytes=4922

然后我通过电子邮件收到此错误:

AttributeError: 'module' object has no attribute 'GeoSQLCompiler'

可以找到完整的追溯here

我在其他地方的aws ec2实例上安装了数据库服务器,并在该服务器上通过了these installation instructions

应用环境

的Django == 1.4 gunicorn == 0.14.2

我使用以下

创建了我的heroku应用程序
heroku create myapp --stack cedar --buildpack http://github.com/cirlabs/heroku-buildpack-geodjango/

如您所见,我正在使用custom buildpack为geodjango安装所有必需的东西。如果我不使用此自定义构建包并只使用heroku create myapp,那么我会得到this long error

我还将这些添加到heroku配置变量

GEOS_LIBRARY_PATH='/app/.geodjango/geos/lib/libgeos_c.so'
GDAL_LIBRARY_PATH='/app/.geodjango/gdal/lib/libgdal.so'

我已尝试过的内容

我用Google搜索了错误,只发现了一个帖here。基本上说要确保我的数据库后端正确设置使用(我已经这样做了)

'ENGINE': 'django.contrib.gis.db.backends.postgis',

我也尝试过改为以下内容:

GEOS_LIBRARY_PATH='/myapp/.geodjango/geos/lib/libgeos_c.so'
GDAL_LIBRARY_PATH='/myapp/.geodjango/gdal/lib/libgdal.so'

此应用程序可以在我的本地开发计算机上使用python manage.py runserverforeman start -f Profile.dev

为什么我不能在Heroku上使用基于geodjango的应用程序,我该如何解决?

1 个答案:

答案 0 :(得分:0)

我大约93.2%确定这是path问题。 Web开发中的一个主要PITAs是您的命令行环境与服务器的环境几乎没有任何共同之处。

当我需要知道完全从哪个目录加载哪些模块版本时,我使用以下内容。它返回一个2元组('name', 'path-to-module')的列表。在初始化完成后,或在尝试加载地理模块(或其他同样有趣的地方)之前和/或之后调用此方法,并将结果转储到屏幕或日志文件中。

我不知道这会解决您的问题,但它可能会给您一些有趣的见解。

注意:您可以编辑(或注释掉)re.sub()来品尝。我只是把它们放进去,因为绝对路径名的大页面在眼睛上是很难的,并且可以掩盖这样的事实:某些东西是从系统的副本而不是你自己的副本中加载的。

modulelist.py

import sys, re, os
import django

def ModuleList():
    ret = []
    dir_project = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
    project_name = os.path.basename(dir_project)

    for k,v in sys.modules.items():

        x = str(v)
        if 'built-in' in x:
            ret.append((k, 'built-in'))
            continue

        m = re.search(r"^.*?'(?P<module>.*?)' from '(?P<file>.*?)'.*$", x)
        if m:
            d = m.groupdict()
            f = d['file']
            f = re.sub(r'/usr/.*?/lib/python[.0-9]*/site-packages/django/', 'system django >> ', f)
            f = re.sub(r'/usr/.*?/lib/python[.0-9]*/site-packages/', 'site-packages >> ', f)
            f = re.sub(r'/usr/.*?/lib/python[.0-9]*/', 'system python >> ', f)
            f = re.sub(dir_project+'.*python/', 'local python >> ', f)
            f = re.sub(dir_project+'.*django/', 'local django >> ', f)
            f = re.sub(dir_project+r'(/\.\./)?', project_name + ' >> ', f)
            ret.append((d['module'], f))
    ret.sort( lambda a,b: cmp(a[0].lower(), b[0].lower()) )
    ret.insert(0, ('Python version', sys.version) )
    ret.insert(0, ('Django version', django.get_version()) )

    return ret
# ModuleList

if __name__ == "__main__":
    for x in ModuleList():
        print "%s\t%s" % (x[0], x[1])