1

私は Django で内部サーバー監視/管理ツールを開発していますが、これにはあまり詳しくありません。多くの場合、アプリケーションは SSH 経由で他のサーバーに接続し、コマンドを発行して応答を読み取る必要があります。現在、私はparamikoでこれを行っており、正常に動作しています。

ただし、現在、リクエストごとに各サーバーに再接続しています。これは悪い設計のように感じます。アプリケーションのライフサイクル全体で、すべての SSH 接続 (ごく少数) を持続させたいと考えています。これは、たとえば NodeJS で可能であることを知っています。

つまり、私がやりたいことは、リクエストごとに新しいローカル変数を作成する代わりに、ある種の「グローバル」変数「ssh_connection1」にアクセスして、それを介してコマンドを発行できるようにすることです。

これはDjangoで可能ですか? これに対するより良い解決策はありますか?

注: 同様の質問を見ましたが、それらは主に接続ではなくリクエスト間のデータの保存について説明していました。

4

2 に答える 2

1

Andrew Gorcesterが提案したように、サーバーと通信して情報を取得する別のプロセス/デーモンを実装できます。また、djangoアプリが表示に使用するDB内の情報をプッシュします。このようにして、実装を分離して、別のモジュールでデータを取得できます。

さらに、デーモンをdjangoに独自のカスタム管理コマンドとして実装して、djangoの利点(同じモデル、メソッドなど)を利用できます。管理コマンドの記述を参照してください。このコマンドは、cronまたはinitスクリプトを介して実行できます。

于 2012-07-05T17:10:34.973 に答える
1

最善の方法は、別のプロセスを使用することだと思います。たとえば、永続的な接続を維持するツイストクライアントなどです。django スレッドは、クライアント プロセスが稼働しているかどうかを確認できます。稼働している場合は、ソケットまたはその他の高速なローカル メソッドを介してそのプロセスと通信できます。これは、PgBouncer などの別のデーモンに依存するプールされたデータベース接続戦略などに似ています。

これはかなり複雑なアプローチですが、別の方法、つまり接続オブジェクトをあるリクエストから別のリクエストに直接渡す方法を私は知りません。そのような接続オブジェクトを渡すことができたとしても、同じ接続オブジェクトを使用しようとする同時リクエストで問題が発生します。twisted を使用して別のプロセスを作成すると、この問題を管理する接続プーリング システムをセットアップできます。

于 2012-07-05T15:54:25.200 に答える