2009-06-02 24 views
1

私のDjangoアプリケーションは、別のページを表示するために独自のページの1つを読み込む必要があります。私は、ページをロードするためにurllib2(Python 2.6で作業している)を使用しようとしていますが、前者が完了するまで新しいリクエストがブロックされているようです。Djangoは自分のページをhttpでリクエストできませんか?

これはデバッグモードで1つのスレッドのみを使用するDjangoには問題がありますか? (私は単にデフォルトのpython manage.py runserverで実行しています)。それをマルチスレッドに求める簡単な方法はありますか?

答えて

6

実際にdevサーバをマルチスレッドにする方法はありません。数年前からdjangoプロジェクトにopen ticket about thisがありました。パッチ(これはあなたのために動作するかどうかを確認するために実装することができます;-))。プロジェクトは管理サーバーを使用して配備することをプロジェクトでは望んでいないため、チケットは「設計上の決定」に閉鎖または延期され続けます。マルチスレッドの場合、「緊急時」になる可能性があります。管理サーバは効率的ではなく、セキュリティのために緊張しているので、誰かがそれを使って実稼働環境を実行する可能性があります.Djangoをインストールすると、セキュリティが悪いという評判を開発して世界中にインストールすることはできません:-)

私の個人的な経験は、AJAXや同時リクエストが発生する可能性のある他のシナリオをテストするために、本番環境のような有線のApacheインスタンスを実行することでした。

リクエストの結果を探しているだけで、サーバーコードにアクセスできるので、リファクタリングを少しお勧めします。そうすることで、そのページの出力の結果をHTTP経由でそのページを呼び出す。実際の結果を返す関数を作成し、通常のHTTPビューでその関数を呼び出します。このようにして、他のアプリケーションコードでもサーバーのラウンドトリップなしでその関数を呼び出すことができます。私はちょうどここに私の回避策を追加しました

+0

良い答えですが、(1.0以降)Django自体は本当にスレッドセーフです。別の方法で経験したことがあれば、問題はほぼ確実にあなたのコードにあります(スレッドに安全でないコードを書くのはとても簡単です)。この「コミュニティウィキ」をマークしたので、その不正確さを削除するために編集します。 –

+0

Carlさんありがとうございました...確かに、私はDjangoで0.96以降のスレッディングを試していませんでしたので、1.0について聞いてうれしく思います。 –

+0

1.0以降であっても、Djangoでスレッドの問題が発生し続けます。物事の現状については、http://code.djangoproject.com/wiki/DjangoSpecifications/Core/Threadingページを見守ることをお勧めします。しかし、そのページが何かが固定されていると言われると、それはトランク内でのみ修正され、その時点では実際にはリリースされないことがあります。だから、本当にあなたはマルチスレッドに言及しているチケットをチェックする必要があります。 –

2

httpを自分自身に使用しようとしないでください。たとえそれが稼働しても(実際のサーバで動作するかもしれませんが、テストサーバでは動作しません)。それはひどく非効率的です。ビューはちょうどPythonの関数です、それらを呼び出す!

もちろん、両方のビューで使用できる正常なモデルと別のテンプレートフラグメントを用意するほうがずっと優れています。

1

render_to_stringを使用しないのはなぜですか?

関連する問題