Djangoのメモ
Djangoを使った実装をおこなった際に調べたことなどをメモります。
一覧
エラーメール送信のメッセージ組み立てはハンドラ付随のRequestクラスです。
エラーメール内のMETA['SERVER_NAME']の出力内容について調べる必要があったため、エラーメールの本文を構築している部分を調べました。
下記にある通り、ModPythonHandlerを使用しているため、ハンドラに付随するリクエストクラスはModPythonRequestクラスです。このクラスの中で、self._metaの値を作っている_get_metaメソッドがあります。
その実装を見ると、META['SERVER_NAME']の値はハンドラに渡されたリクエストを表すオブジェクトの値をそのまま出力しているようでした。
リクエスト処理時の500エラーメール送信はBaseHandlerの中で処理されています。
エラーメールの出力内容について調べる必要があったため、coreパッケージの中をのぞいみてみました。
Djangoでは、リクエストのレスポンスを作成する処理はハンドラがあります。
今回、django.core.handlers.modpythonパッケージを使用しているため、ModPythonHandlerクラスが実際には処理しています。このクラスはBaseHandlerクラスを継承しており、基本的な処理はこのクラスにて実装されています。
余談ですが、wsgiで処理するようのdjango.core.handlers.wsgiもあり、この場合にはWSGIHandlerというクラスがあります。こちらもbaseHandlerクラスを継承しています。
ModPythonHandler.__call__メソッドで返却するレスポンスの作成をおこなっていますが、このメソッドの中でBaseHandler.get_responseメソッドを呼んでいます。このメソッドの中の例外処理にエラーメールを送信する箇所が実装されていました。そして、実際にメールの送信を実行をおこなっているのは、BaseHandler.handle_uncaught_exceptionメソッドでした。SMTPでのメール送信をおこなうクラスは別に存在します。
runserver時のオプションの順番には注意が必要です。
runserver時に、--settingsオプションと--adminmediaを付けていましたが--adminmediaが適用されずうまく動かいないということがありました。理由は、--settingsより前に--adminmediaを指定していたため無視されていたことが原因でした。記述の順序を入れ替えることで無事クリアすることができました。