2012-02-05 5 views
1

私はDjangoアプリケーションにいくつかの管理コマンドを用意しています。管理コマンドが実行されるたびに、私のモデルに1つのエントリーを記録したいのです。このモデルには、次の4つのフィールドがあります。コマンドの詳細をログに記録するカスタムDjango BaseCommandクラスの作成

  • started - コマンドが開始された時刻。
  • ended - コマンドが終了/停止した時刻。
  • success - コマンドが正常に実行されたかどうかを示すブール値。
  • name - コマンドの名前。

私はこれを実装するための最良の方法は、django.core.management.base.BaseCommandから派生LoggedBaseCommandというカスタムクラスを記述することだろうと思いました。私の管理コマンドは、単純なロギング機能を含むこのクラスから派生します。

これを実装する方法についてはいくつか知っていますが、これをどのように接着するかを理解できないようです。

助けが必要ですか?

おかげ

+0

これまでのところとても良いです。これまでに持っていた 'LoggedBaseCommand(django.core.management.base.BaseCommand)'コードを投稿してください。 'handle'をオーバーライドするだけで済むようにしてください。 –

答えて

2
from commandlog.models import CommandLogEntry 
class LoggedBaseCommand(Command): 

    def handle(self, *args, **options): 
     # 'started' ought to be automatic, 'ended' and 'success' not yet determined. 
     c = CommandLogEntry(name = __file__) 
     result = "FAIL" 
     try: 
      result = self.handle_and_log(*args, **options) 
     except: 
      pass 
     c.success = result 
     c.ended = datetime.datetime.now() 
     c.save() 

    def handle_and_log(self, *args, **options): 
     # All of your child classes use this. 

あなたはおそらくパスを取り除くために、reを使用してと「の.py」を終了し、__file__エントリをいじるする必要があるかもしれませんが、すべてのコマンドは、階層内のファイル名に基づいているので、これはトリックを行うべきです。私は失敗を仮定し、handle_and_log()関数が成功文字列を返す場合にのみ成功を記録することに注意してください。 (あなたのニーズに合わせて変更する)。例外をスローすると、失敗が記録されます。この場合も、必要に応じて変更します(例外文字列を記録します)。

関連する問題