2

ビューとコントローラーのコードを変更した後、Rails を再起動する必要はありません。そのような機能は Python Web フレームワークにも存在しますか?

以前にFlaskとPyramidを試しました。のみを変更した場合は再起動する必要がないことはわかっていますが、 を変更した場合は再起動する必要があります(これはtemplateの場合viewsと似ていますcontrollers) rails。また、再起動が完了するまで数秒かかります。

私が覚えているように、railsでコードを変更しても、再起動する必要はありませんcontrollers。そのような機能が Python Web フレームワークにも存在するかどうかについて考えている人はいますか?

4

2 に答える 2

2

Rails は、開発時のリロードを次のように実装します。2 つのメカニズムが働いています。

  1. コードが存在しないクラスを参照するときはいつでも、コールバック (const_missing) を呼び出すことができます。Rails はそのようなコールバックをインストールします。このコールバックでは、アプリケーション ロード パスの 1 つ (アプリ/モデルなど) に対応するクラスがあるかどうかを確認し、それをロードして続行します。このメカニズムは「Rails オートローディング」と呼ばれます (Ruby のオートローディングと混同しないでください。これは別のものです)。
  2. Rails は、オートロードされたクラスを追跡します。リクエストの最後に、これらのクラスをすべてメモリから削除します。

明らかに、これにはいくつかの制限があります。コードがグローバル変数に何かを格納している場合、Rails はリクエストの最後にそれらをクリアしません。そのため、グローバル変数が大きくなり続けると、開発中にメモリ リークが発生します。また、リロードにより、本番環境での開発間でセマンティクスに微妙な違いが生じます。一方、次のようなもの

scope :older_than_one_year, where('date < ?', 1.year.ago)

開発では意図したとおりに機能します (リクエストごとにモデルがリロードされ、1.year.ago が常に再評価されるため)、本番環境では意図したとおりに機能しません (1.year.ago は 1 回しか評価されないため) 、つまり、アプリが 1 年間実行されている場合、そのスコープは実際には2 年前に変換されます)。

Python で何かを実装できるかどうか、Python のオンザフライ クラス作成/変更/削除機能に慣れていないか、const_missing に似たフックがあるかどうかはわかりません。

于 2013-01-03T15:05:08.097 に答える