2017-03-05 58 views
0

URLに渡された主キーに基づいてモデルからのデータを含むWebページを表示する処理をするDjangoアプリケーションがあります。これはすべて正常に動作し、Djangoコンポーネントは大部分。最初のDjango起動時にコードを実行

私の質問にもかかわらず、AppConfigを使用するなど、複数の方法を試しました.Djangoサーバーの起動時にコードを呼び出して別のスレッドを作成してそのソースからの有効なデータをモデルとしてデータベースに記録します。

モデルを作成してデータベースに保存するスレッドコードが書かれていますが、私の問題はAppConfigを使ってコードを処理しようとすると、 django.core.exceptions.AppRegistryNotReady:アプリケーションはまだ読み込まれていません。エラーが発生し、サーバーは起動しません。

どこにコードを配置するのが適切でしょうか?問題に私のアプローチは間違っていますか?

+0

正直言って、URLに渡された主キーを保持するモデルと同じディレクトリにファイルを置くだけです。 –

答えて

4

Webサーバーのようなブロッキングプロセスを回避するためにスレッドを使用しようとするのは苦痛の練習です。私はこれまでにやったことがあり、壊れやすく、しばしば予期しない結果をもたらすことがあります。

もっと簡単に考えてみると、別々のプロセスで実行される別々のワーカーを作成し、別々に開始することができます。それは同じデータベースへのアクセスを持ち、あなたのDjangoモデルを使用することさえできます。これは、Herokuのようなホストがこの問題に近づく方法です。それは別々にテストできるという追加の利点があり、あなたがメインのDjangoアプリケーションで作業している間はまったく動かす必要はありません。

最近では、VagrantやDockerのようなコンテナ化オプションのような多数の仮想化オプションを使用して、並列プロセスと作業者を実行することは簡単です。野生では、文字通り別のサーバー上でデータベースと一緒に別のサーバー上で実行されている可能性があります。コメントで述べたように、ワーカープロセスの開始は別のDjango management commandに簡単に委任できます。これは、順番に、あなたのWebサーバー上のgunicornによってかなり簡単に別のワーカープロセスに変わる可能性があります。

+1

これはDjangoの管理コマンドとして最もよく実装され、別々に実行されます。 –

+0

私は最後の文は 'gunicornがdjango管理コマンドとして設定できるように誤って解釈される可能性があります。編集が必要な場合があります。 – hurturk

関連する問題