2

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/」にあります。

4

0 に答える 0