Django アプリケーションを modWSGI から Gunicorn/NGINX に変換しています。サーバーの起動時に確実に実行されるように、modwsgi ファイルから実行していた django コードがいくつかあります。これをGunicornのスタートアップで機能させる方法を見つけようとしています。
免責事項 - 私がアクセスしたいコードは、データベースからのデータを処理し、後で Django アプリで行う多くの作業に適した形式でデータを保存する貧乏人のキャッシュです。 この質問は、キャッシュ ソリューションの使用と比較したこの方法のメリットに関するものではありません。
mod-WSGI で問題なく動作するコードを次に示します。
sys.path.append('/src/accx/navigation')
from navigation.views import rebuild_cache_all
rebuild_cache_all()
「accx」は Django プロジェクト、「navigation」は Django アプリです。
今、私はGunicornを使って同じことをしようとしています.
def when_ready(server):
from navigation.views import rebuild_cache_all
rebuild_cache_all()
また、このコードのさまざまな場所で sys.path に追加しようとしましたが、何をしても、次のエラーが発生します。
ImportError: No module named navigation.views
明らかな何かが欠けていますか?私はこれについて間違った方法で行っていますか?あらゆるガイダンスを歓迎します。
.............答え..............
上記の質問を入力した後、私は自分に「関連する」として表示された他のいくつかのガンコーンの質問を熟読していました質問ですが、私の検索には表示されませんでした。そうしているうちに、私は自分の問題を理解しました。
後追いスラッシュ!
gunicorn で sys.path に追加しようとしたときに、1 つも使用しませんでした。それを修正すると、gunicorn が Django_settings_module を失ったと不平を言い始めたので、それも提供する必要がありました。
ここに私が持っているものがあります:
import sys,os
if not '/src/accx-venv/' in sys.path:
sys.path.insert(0,'/src/accx-venv/')
os.environ["DJANGO_SETTINGS_MODULE"] = "accx.settings"
def when_ready(server):
if not '/src/accx-venv/accx/' in sys.path:
sys.path.insert(0,'/src/accx-venv/accx/')
from navigation.views import rebuild_cache_all
rebuild_cache_all()
おそらくもっときれいな別の方法がありますが、これでうまくいきました。