1

mod_wsgiでDjango1.3を使用しています

私の中でsettings.py

DISABLE_SYSTEM = False
DISABLE_USER_INTERFACE = False
MIDDLEWARE_CLASSES = [
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
]
if DISABLE_SYSTEM:
    MIDDLEWARE_CLASSES.insert(0, 'SomeMiddleware')
if DISABLE_USER_INTERFACE:
    MIDDLEWARE_CLASSES.append('SomeOtherMiddleware')

に設定DISABLE_SYSTEMするとTrueSomeMiddlewareprocess_request関数は警告メッセージを返し、HttpResponseそれに続くMiddewaresはまったく実行されません。それは私にメンテナンスのための一種のシステムシャットダウンを与えます

DISABLE_USER_INTERFACEフィルタrequestとユーザーによって呼び出されたすべてのビュー関数はブロックされますが、adminURLと管理関数は通常どおり実行されます。

これまで、これをさまざまな種類のメンテナンスに使用していました。ファイルから変更し、wsgiをタッチしてPythonモジュールを再ロードするだけです。しかし今、私は一種のスケジュールされたルーチンを使用して、ユーザーベースのリクエストを停止し、バックグラウンドでいくつかのメンテナンスを行い、いくつかは管理者から行う必要があります。

この時点で、iシステム(ユーザーではない)はfromに設定DISABLE_USER_INTERFACEし、メンテナンスを開始する必要があります。しかし、私はそれを行うためのより適切な方法、またはこれを他の場所からではなくどこかで処理するためのより良い方法を見つけることができませんでした。Truesettings.pysettings.py

settings py変更よりもラインインDISABLE_USER_INTERFACEは、この関数を1日1回使用する必要があり、リクエストごとにこれら2つのミドルウェアを使用することは私には論理的ではないように思われるためです。したがって、私の現在のモデルでは、実行する必要がある場合にのみ実行されます

任意の提案をいただければ幸いです。

更新:私がやりたいのは、毎日19:00から19:30の間にユーザーインターフェイスを無効にすることです。次のようなミドルウェアレベルのチェックを行うかどうかはわかりません。

if 19:00<now()<19:30:
    stop system

すべてのリクエストに対して。不必要なプロセスを回避する、より効率的なものが必要です。それとも、ミドルウェアはその種の作品にとって正しい選択ですか?

4

1 に答える 1

1

設定の変更をスケジュールした場合は、何をしているかを再検討することをお勧めします。

ミドルウェアははるかに賢くなります。これにより、設定が非常に面倒になる可能性があります。

常にインストールされているSomeMiddlewareクラスを1つ用意することを強くお勧めします。

次に、そのSomeMiddlewareクラスはをチェックしてsettings、実行する動作を決定できます。

これを行うにはまだ良い方法があります。

定期メンテナンスの設定を必ずしも変更する必要はありません。実行中のDjangoアプリケーションでミドルウェアと通信する方法はたくさんあります。最速の1つは、データベースを使用することです。

ミドルウェアによって単純にフェッチされて何が起こっているかを確認する1つ(またはいくつか)の属性を持つ「動作モード」クラス定義を作成できます。このテーブルで簡単な更新を実行してモードを変更する管理アプリを作成できます。

ミドルウェアの動作を変更する「動作モード」のファイル名(存在する場合)を設定できます。親切な機能を実行するだけで、os.path.exists()何をすべきかを(すばやく)チェックできます。

于 2012-01-04T15:38:45.973 に答える