0

私の見解では、外部APIに接続するモジュールを使用しています。このモジュールで、たとえばのようなカスタム例外をスローしたいと思いますApiServerNotRespond。次に、この例外によってカスタムビュー/テンプレートがレンダリングされるようにします。たとえば、私のビュー「connect_to_api」(APIモジュールを使用している場合)でapiモジュールがApiServerNotRespond例外を引き起こす場合、たとえばnot_respond、代わりにビューが呼び出されるか、myapp/not_respomd.htmlテンプレートがレンダリングされます。

すべての構成を設定ファイルではなくアプリディレクトリに配置したいので、ミドルウェアを使用したくありません。

カスタム例外をどこでどのように定義でき、発生後にカスタムテンプレートを強制的にレンダリングする方法は?

4

2 に答える 2

1

デコレータを書くことでこれを達成できると思います。

デコレータは、キャッチApiServerNotRespondまたはその他の必要な例外をキャッチする必要があります。そして、そのような例外が発生した場合は、必要なテンプレートを使用して応答を返します。それ以外の場合は、元のビューから応答を返します。

サンプル:

def custom_error_handler():
    def decorator(orig_func):
        def inner_func(request, *args, **kwargs):
            try:
                return orig_func(request, *args, **kwargs)
            except ApiServerNotRespond:
                context = {}
                return render_to_response('custom_template.html', context
                         context_instance = RequestContext(request))
            except Exception:
                #handle all other errors, may be just raise
                raise 
       return wraps(orig_func)(inner_func)
    return decorator 

あなたのviews.pyで、

@custom_error_handler
def sample_view1(request):
    #your code
于 2012-11-30T08:51:24.640 に答える
0

適切な例外を実行することもできますが、モジュールの関数への呼び出しを同様の方法でラップする必要があるget_object_or_404()ため、例外が発生するたびに、実際にはエラーページにリダイレクトされます。また、サービスへのすべての呼び出しをラップする必要があります...

別のアプローチは、サービスを処理するビューにデコレータを使用することです。次に、api関数呼び出しで例外が発生し、デコレータがそれをキャッチして適切なページ(login_requiredデコレータなど)をレンダリングします。-私はこれを選びます、よりエレガントです:)

いずれにせよ、サービスに何らかのラッパー呼び出しを提供して、文字通り例外をスローする必要があるでしょう。

于 2012-11-30T08:57:20.807 に答える