4

問題

geodjango アプリケーションを Heroku にデプロイしようとしています。アプリケーションは実行されますが、/admin/world/worldborder/(世界の geodjango チュートリアル アプリケーション) または独自のカスタム 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'

完全なトレースバックはここにあります

他の場所にある aws ec2 インスタンスにデータベース サーバーがあり、そのサーバーでこれらのインストール手順を実行しました。

アプリのコンテキスト

Django==1.4 ガンコーン==0.14.2

次のようにherokuアプリを作成しました

heroku create myapp --stack cedar --buildpack http://github.com/cirlabs/heroku-buildpack-geodjango/

ご覧のとおり、カスタム ビルドパックを使用してgeodjangoに必要なものをすべてインストールしています。このカスタム ビルドパックを使用せずに単に使用するheroku create myappと、この長いエラーが発生します

これらもheroku構成変数に追加しました

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

私がすでに試したこと

私はエラーをグーグルで調べましたが、ここに投稿が1つしかありませんでした。基本的に、データベースのバックエンドが使用するように正しく設定されていることを確認するように言います (私はこれを行いました)

'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 runserverこのアプリケーションは、またはのいずれかを使用して、ローカルの開発マシンで正常に動作しますforeman start -f Profile.dev

geodjango ベースのアプリを Heroku で使用できないのはなぜですか? どうすれば修正できますか?

4

1 に答える 1

0

私はこれがpath問題であると約93.2%確信しています。Web開発における主要なPITAの1つは、コマンドライン環境にサーバーの環境とほとんど共通点がない可能性があることです。

どのモジュールのどのバージョンがどのディレクトリからロードされているかを正確に知る必要がある場合は、次を使用します。2タプルのリストを返します('name', 'path-to-module')。初期化が完了した後、またはgeoモジュール(または他の同様に興味深い場所)をロードしようとする直前および/または直後にこれを呼び出し、結果を画面またはログファイルにダンプします。

これで問題が解決するかどうかはわかりませんが、興味深い洞察が得られる可能性があります。

注:sを編集(またはコメントアウト)し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])
于 2012-07-24T18:13:36.990 に答える