5

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に追加する正しい方法は何ですか?ありがとう!

4

3 に答える 3

10

私の問題を理解しました。turkディレクトリモジュールをインポートするには、appディレクトリではなくPythonパスにプロジェクトディレクトリを追加する必要があります。つまり、topturk / top/turkではなくtopturk/topです。

python top/manage.py run_gunicorn

python top/manage.py runserver

Pythonパスのドキュメントに従って、呼び出し元モジュールのディレクトリは常にPythonパスタプルの要素0として追加されるため、正常に機能していました。したがって、top / manage.pyが使用されていた場合、topturk/topは常にPythonパスにありました。

ただし、herokuでは、Procfileはプロジェクトの親ディレクトリであるtopturkにあり、topturk / topではないため、Procfileコマンドを実行すると、topturkはPythonパスに追加されますが、topturk / topには追加されないため、エラーが発生します。

後から考えると、これがこのセクションの最後の文でDjangoのドキュメントが参照しているものであることがわかりました:https ://docs.djangoproject.com/en/dev/howto/deployment/wsgi/gunicorn/#running-django-in -gunicorn-as-a-generic-wsgi-application。このコマンドを実行するには、プロジェクトがPythonパス上にある必要があると言われています。

追加することで解決した問題

sys.path.insert(1, os.path.dirname(os.path.realpath(__file__)))

settings.pyまたはwsgi.pyのいずれかに-他の人が推奨しているように設定.pyに追加されました(http://codespatter.com/2009/04/10/how-to-add-locations-to- python-path-for-reusable-django-apps /)ですが、インサートを配置するのに最適な場所がわかりません。誰か知ってる?

于 2012-07-26T01:02:27.000 に答える
1

上記の方法は、gunicornによって非推奨になりました。警告メッセージで失敗した場合、私が同じことを試みたとき!

(venv)root @ ip-172-31-23-172:〜/ myproj#python manage.py run_gunicorn 0.0.0.0:8001

!!!

!!! 警告:このコマンドは非推奨です。

!!!

!!! これで、WSGIインターフェイスを使用してアプリケーションを実行する必要があります

!!! プロジェクトとともにインストールされます。元。:

!!!

!!! gunicorn myproject.wsgi:application

!!!

!!! https://docs.djangoproject.com/en/1.5/howto/deployment/wsgi/gunicorn/を参照してください

!!! 詳細については。

!!!

したがって、私は以下のコマンドを試しましたが、それは私のために働きました。

gunicorn myproject.wsgi:application
于 2015-10-23T12:14:20.277 に答える
0

「gunicorn」をsettings.py/INSTALLED_APPSに追加して、

python manage.py run_gunicorn 127.0.0.0:8001

(好きなポートが何であれ)詳細については、https ://pypi.python.org/pypi/gunicorn/をご覧ください。

于 2013-10-08T13:53:41.310 に答える