1

私は django プロジェクトに取り組んでおり、そのモデルと関係のデータベースを持つとともにactivity_logs、プロジェクト ディレクトリの外部と呼ばれるログ ディレクトリに書き込み、書式設定されたユーザー アクティビティをユーザーごとに 1 つのファイルで追跡します。これは、データベース テーブルにこの情報を保持する代わりのファイル構造ベースのソリューションです。これは、DB から一部のストレージをオフロードし、そのようなアクティビティをフォーマットして表現するのが比較的簡単であるためです。おそらく、この種のデータをデータベースに保存することをお勧めする人もいるかもしれませんが、それは問題ありませんが、これらすべてから、回答の助けが必要な疑問があると思います.

この django プロジェクトには、アプリごとに 1 つずつ、広範なテスト スイートを持つ複数のアプリがあります。さらに、logging.pyロギング機能 (ログ ファイルへの/からのアクティビティの書き込み/読み取り) をカプセル化するファイルがあるため、テスト スイート内のテスト ケースと表示関数 (およびその他のさまざまなユーティリティ関数) の両方で、これらのロギングが使用されます。これらのユーザー アクティビティを保存し、モデルの関係に基づいてそれらを取得して、ユーザー通知システムをエミュレートするための関数。ロギング モジュールはこのロギングを処理するため、書き込み先を知る必要があるため、ディレクトリ構造は次のようになります。activity_logsユーザー ログ ファイルが書き込まれ、新しいユーザー用に 1 つが作成され、データベースから削除されたユーザー用に 1 つが削除されます。このプロジェクトで行いたい最新の変更の 1 つは、このログ機能をテストするための別のログ ディレクトリを作成することですtest_activity_logs。実際のユーザー用のディレクトリ。

私の問題はこれです:実行時に、どの実行開始点でもシステムにどのように伝えることができますか(djangoテストClientオブジェクトを介したビュー関数呼び出し、テストケース、URL経由で行われた実際のHTTPリクエストなど) 、activity_logsまたはtest_activity_logsディレクトリ内をいつ調べるか? 実際のユーザーまたはテスト ユーザーのどちらに対して新しい情報を生成しているかにのみ依存しますが、ユーザーはシステム内のユーザーであり、いくつかのログ関数を呼び出してログに書き込むこれらの関数に指示しようとすると、いくつかの問題に直面しています。テスト ログ ディレクトリと通常のディレクトリ。たとえば、私が試みている 1 つのアプローチは、キーワード引数 (kwarg) をロギング関数に渡して、次のように、どのディレクトリを読み書きするかを認識できるようにすることです。

self.assertTrue(activity_has_been_logged(ACTIVITY_ACCOUNT_CREATED, user.get_profile(), use_test_activity_log_directory=True) == True)

呼び出された kwarg は、テスト アクティビティ ログ ディレクトリを読み取るためにuse_test_activity_log_directory=True呼び出されたロギング関数に通知します。残念ながら、少し融通が利かない (しかし許容できる) ことは別として、これは django テストオブジェクトが GET または POST リクエストを URL 経由でビュー関数に送信し、アクティビティをログ ファイルに書き込むactivity_has_been_logged状況を解決しません。client

response = client.post(propose_match_url, post) #Can't write to test_log_directory if by default it writes to regular directory!

クライアントがこのkwargをこれらのビュー関数に渡すにはどうすればよいですか? これを行うことは完全に可能だと思いますが、これらのkwargsをいじるのが最善の方法なのか、プロジェクト設定ファイルにグローバル変数を作成するのかはわかりませんが、競合状態で問題が発生する可能性があります可変共有変数を使用します。

あなたの助けは素晴らしいでしょう。前もって感謝します!

4

2 に答える 2

1

だから私はこの問題を解決しました。他のすべてのコンポーネントはロギングモジュールから関数を呼び出してこれらのディレクトリとの間で書き込み/読み取りを行うため、すべてのロギング機能をホストするロギングファイルは実際にはどこを見ればよいか(test_activity_logsまたは)を知る必要がある唯一の場所です。if 、またはifを調べるかどうかを決定するために、ブールフィールドと呼ばれるactivity_logsクラスのモデルクラスに追加のフィールドを指定しました。このように、ロギングモジュールは、タイプの入力パラメータとその新しいフィールドをチェックするだけで、ロギング機能を実行する場所を決定できます。問題が解決しました!UserProfileis_testtest_activity_logsis_test=Trueactivity_logsis_test=FalseUserProfile

于 2012-10-12T06:08:00.003 に答える
0

*nix ボックスを使用している場合、または OS X で launchd を使用している場合は、daemontools を確認してください。どちらも、Django インスタンスを任意のモードで実行し続けることができ (daemontools には、そのためのオプションがいくつかあります)、stdout をログに記録するためのディレクトリを分離できます。 /stderr.

各インスタンスの環境変数を設定して、他のログ ファイルと一時ファイルが作成される場所を認識できるようにすることができます。これは、os.environment から取得するか、daemontools を使用している場合は単に現在の作業ディレクトリをベースとして使用します。

このディレクトリは、daemontools を使用して自動的に作成されます。

于 2012-10-08T22:59:56.810 に答える