Supervisord によって制御される uwsgi の virtualenv で実行されている Django プロジェクトがあります。Django プロジェクトには、すべての Django アプリを配置する追加のディレクトリ「apps/」があります。私のsettings.pyでは、「apps /」ディレクトリをpythonパスに追加して、その中のDjangoアプリが見つかるようにします。
これは runserver で非常にうまく機能します。しかし、本番環境には uwsgi があります。サーバーを起動すると、Django アプリは、INSTALLED_APPS で定義された順序ではなく、ファイル システムにあるため、アルファベット順に読み込まれます。
例: ファイルシステムに次のアプリがあります。
/home/anton/project/apps/events
/home/anton/project/apps/profiles
/home/anton/project/apps/routes
プロファイルは私の拡張ユーザー プロファイルであり、ルートは自転車ルートであり、イベントは 1..n ルートを持つことができるため、ルートに依存します。
したがって、私の INSTALLED_APPS では、次のように定義されています。
INSTALLED_APPS = [
# .. django stuff ..
'profiles',
'routes',
'events',
]
イベント アプリの models.py で、ルート アプリからモデルをインポートします。Django アプリが INSTALLED_APPS 設定で指定された順序で読み込まれている限り、すべて正常に動作します。ただし、uWSGI は Django アプリをアルファベット順にロードします。また、ルートの前にイベントが読み込まれるため、イベント アプリの models.py で次のエラーが発生します。
ImportError at /
cannot import name Route
/myproject/app/src/apps/events/models.py in <module>
from routes.models import Route
したがって、イベント アプリをロードするとき、uwsgi はルート アプリについて認識しません。uwsgi がすべての python モジュール (読み取り: Django アプリ) をロードしてから、リクエストの実行を開始するべきではありませんか?
すべてのヒントは大歓迎です!
ありがとう、アントン
PS:
ここに私の uwsgi.ini 設定があります(これが役立つかもしれません)
[uwsgi]
http-socket = :8081
master = true
workers = 8
pidfile = /tmp/uwsgi-project.pid
chdir = /project/app/src/apps/
pythonpath = /project/app/src/
module = wsgi
virtualenv = /home/anton/.virtualenvs/project/
env = DJANGO_SETTINGS_MODULE=settings
logto = /project/log/uwsgi-bikemap.log
max-requests = 5000
vacuum = true
「/project/app/src/」は Django プロジェクトの場所です。「/project/app/src/apps」は、Django アプリがある場所です。wsgi.py (モジュール = wsgi で参照) は「/project/app/src/」にあります。