0

在我看来,我正在使用一些连接到外部 api 的模块。我希望这个模块抛出一些自定义异常,例如ApiServerNotRespond。然后我希望这个异常导致自定义视图/模板被呈现。例如,如果在我的视图中“connect_to_api”(我正在使用我的 api 模块)api 模块将导致ApiServerNotRespond异常,那么例如not_respond调用视图或仅myapp/not_respomd.html渲染模板。

我不想使用任何中间件,因为我希望所有配置都驻留在我的应用程序目录中,而不是设置文件中。

我可以在哪里以及如何定义自定义异常以及如何在它引发后强制它呈现自定义模板?

4

2 回答 2

1

I think you can achieve this by writing a decorator.

The decorator should catch ApiServerNotRespond or any other exception you want. And if such exception occurs return response with template you want otherwise just return response from the original view.

Sample:

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 

In your 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 回答