Herokuにgunicornを使用してDjangoアプリをデプロイしようとしていますが、いくつかの問題が発生しました。
プロジェクトを開始したとき、Djangoのバージョンは1.3で、標準のwsgi.pyモジュールが含まれていなかったため、標準のwsgiモジュールをtop / wsgi.pyとして追加しました(topはプロジェクト名、turkはアプリ名、topturkは含まれているディレクトリ-保存されるため、エラーログは以下で意味があります)。
今私が走るとき
gunicorn top.wsgi:application -b 0.0.0.0:$PORT
サーバーは正常に起動します。
19:00:42 web.1 | started with pid 7869
19:00:42 web.1 | 2012-07-25 19:00:42 [7869] [INFO] Starting gunicorn 0.14.5
19:00:42 web.1 | 2012-07-25 19:00:42 [7869] [INFO] Listening at: http://0.0.0.0:5000 (7869)
19:00:42 web.1 | 2012-07-25 19:00:42 [7869] [INFO] Using worker: sync
19:00:42 web.1 | 2012-07-25 19:00:42 [7870] [INFO] Booting worker with pid: 7870
しかし、0.0.0.0:5000に移動すると、内部サーバーエラーが返されます。
19:00:45 web.1 | 2012-07-25 17:00:45 [7870] [ERROR] Error handling request
19:00:45 web.1 | Traceback (most recent call last):
19:00:45 web.1 | File "/Users/intenex/Dropbox/code/django/topturk/venv/lib/python2.7/site-packages/gunicorn/workers/sync.py", line 102, in handle_request
19:00:45 web.1 | respiter = self.wsgi(environ, resp.start_response)
19:00:45 web.1 | File "/Users/intenex/Dropbox/code/django/topturk/venv/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 219, in __call__
19:00:45 web.1 | self.load_middleware()
19:00:45 web.1 | File "/Users/intenex/Dropbox/code/django/topturk/venv/lib/python2.7/site-packages/django/core/handlers/base.py", line 47, in load_middleware
19:00:45 web.1 | raise exceptions.ImproperlyConfigured('Error importing middleware %s: "%s"' % (mw_module, e))
19:00:45 web.1 | ImproperlyConfigured: Error importing middleware turk.middleware.subdomain: "No module named turk.middleware.subdomain"
19:00:47 web.1 | 2012-07-25 17:00:47 [7870] [ERROR] Error handling request
19:00:47 web.1 | Traceback (most recent call last):
19:00:47 web.1 | File "/Users/intenex/Dropbox/code/django/topturk/venv/lib/python2.7/site-packages/gunicorn/workers/sync.py", line 102, in handle_request
19:00:47 web.1 | respiter = self.wsgi(environ, resp.start_response)
19:00:47 web.1 | File "/Users/intenex/Dropbox/code/django/topturk/venv/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 219, in __call__
19:00:47 web.1 | self.load_middleware()
19:00:47 web.1 | File "/Users/intenex/Dropbox/code/django/topturk/venv/lib/python2.7/site-packages/django/core/handlers/base.py", line 47, in load_middleware
19:00:47 web.1 | raise exceptions.ImproperlyConfigured('Error importing middleware %s: "%s"' % (mw_module, e))
19:00:47 web.1 | ImproperlyConfigured: Error importing middleware turk.middleware.subdomain: "No module named turk.middleware.subdomain"
これはPythonパスエラーであり、サーバーがアプリディレクトリからインポートする方法を知らないと思います。
関連するインポートコードは、設定にあります。
MIDDLEWARE_CLASSES = (
'turk.middleware.subdomain.SubdomainMiddleware',
'turk.middleware.removewww.RemoveWWWMiddleware',
)
私はこの問題を修正するために、私のappディレクトリを次のようにsettings.pyファイルの上部にあるsys.pathに挿入しようとしました。
PROJECT_ROOT = os.path.dirname(os.path.realpath(__file__))
sys.path.insert(1, PROJECT_ROOT+'/turk/')
私が確認したところ、パスにアプリディレクトリが追加されていますが、それでもサイコロはありません。何か案は?また
sys.path.insert(1, PROJECT_ROOT+'/turk/')
ハックのようで、ディレクトリの少なくとも2つのコピーをパスに追加します。DjangoのPYTHON_PATHに追加する正しい方法は何ですか?ありがとう!