2012-12-11 14 views
5

ミドルウェアでは、各HTTP要求の始めと終わりにコードを実行できます。任意のdjango管理コマンドの前にコードを実行

セロリのタスクでは、私はtask_preruntask_postrunシグナルを使って同じことを達成できます。

django管理コマンドについてはどうですか?各django管理コマンドの最初と最後に実行されるコードを持つことは可能ですか?そのようなコードは、どのdjango管理コマンドが実行しようとしているか(または実行を終了しているか)も知っていなければなりません。 signal on application startupについてのチケットがありますが、これは私が望むことをするかもしれないし、しないかもしれませんが、とにかく準備ができていません。

答えて

2

あなたが正しくあなたがすべての起動時に実行されるコードを置くことができますジャンゴには、特定の場所がありません状態として...

あなたは、この目的のための「誤用」、例えばすることができるかもしれないいくつかの場所があります。 urls.pyまたはmodels.pyのコードは起動時に実行する必要があります(たとえば、管理者はadmin.autodiscover()のこの状況をurls.pyに使用します)。

コードが原因管理コマンドの実行に実行されているかどうかを確認するためにいくつかの可能性もあります。制御コマンドが含まれている場合は、sys.argvでコマンドライン引数を明示的に確認できます。別のpossibiltyは、サーバー/管理コマンドを経由してアプリを実行するためのさまざまな設定を指定することです....

+0

これは私だったような偽陽性の呼び出しを防ぐために-で始まっていないことをことを確認する必要があります思った。完全ではない完全ではない別のアプローチは、MonkeyPatch django.core.management.base.py、特に 'BaseCommand.execute()'にあり、その周りにラッパーを置くことです。 –

+0

もしあなたが猿のパッチを当てるのが好きなら...まずは何を達成したいですか? –

+0

さて、私はワオを演奏している間、私のサルがクラッシュするのを止めてほしいです。 :-) –

0

あなたが管理コマンドの後に/前に追加する必要があるコードは、モデル/設定をDjangoのためにアクセスを必要としない場合は、uができます単にmanage.pyスクリプトを更新してください。

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app.settings") 

from django.core.management import execute_from_command_line 
from startup import pre_management_command, post_management_command 

pre_management_command(sys.argv[1], sys.argv[2:]) 
execute_from_command_line(sys.argv) 
post_management_command(sys.argv[1], sys.argv[2:]) 

私は100%確実ではないが、私はpost_management_commandはDjangoのモデルへのアクセスを持っているでしょうとします。

これは単なる基本的な例であり、実際にはuはsys.argvは、少なくとも2つのエントリを有し、第2のエントリが

./manage.py 
./manage.py -h 
./manage.py --help 
関連する問題