6

ミドルウェアに例外をキャッチさせ、エラーをHTMLテンプレートにレンダリングする代わりに、JSONオブジェクトを返すための最良の方法について誰かが意見を持っていますか?現在、例外をキャッチするミドルウェアが以下にあり、追加のユーザーエラーメッセージが見つかった場合は、それをリクエストに追加します(テンプレートがそれを取得します)。

クラスExceptionUserErrorMessageMiddleware(object):
    def process_exception(self、request、exception):
        "" "例外にユーザーに関連する情報がある場合は、
        それをリクエストオブジェクトにタックします"" "

        theFormat = djrequest.get_getvar(request、settings.FORMAT_PARAM、 "")
        msg = getMessage(例外)
        msgの場合:
            setattr(request、USER_ERROR_MESSAGE_ATTR、msg)

        theFormat == "json"の場合:
            「何かをする」を印刷する

ここでjsonオブジェクトを返す最良の方法は何ですか?追加のヘッダーを設定する必要がありますか?

ミドルウェアを通過しない例外的な状況で同じことを行う方法はありますか(404は通過しないと確信していますが、他にありますか)?

4

1 に答える 1

6

プロジェクトMapIt(https://github.com/mysociety/mapit)でこれを行うために行うことは、ミドルウェアに例外を発生させることです。ミドルウェアは、それに応じてHTMLテンプレートまたはJSONオブジェクトのいずれかを直接返します。リクエストによって提供されたフォーマット。コードはhttps://github.com/mysociety/mapit/blob/master/mapit/middleware/view_error.pyで表示できます。

追加のヘッダーに関して、output_json関数は'application/json;への応答にContent-Typeを設定します。charset =utf-8'。

404の場合、get_object_or_404をラップし、Django Http404例外を独自の例外に変換する独自のget_object_or_404関数があり、リクエストに適切な場合はJSONを正しく返します。

from django.shortcuts import get_object_or_404 as orig_get_object_or_404

def get_object_or_404(klass, format='json', *args, **kwargs):
    try:
        return orig_get_object_or_404(klass, *args, **kwargs)
    except http.Http404, e:
        raise ViewException(format, str(e), 404)
于 2012-07-06T17:00:49.027 に答える