在我看来,我正在使用一些连接到外部api的模块。
我希望这个模块抛出一些自定义异常,例如ApiServerNotRespond
。
然后我希望此异常导致呈现自定义视图/模板。例如,如果在我的视图中“connect_to_api”(我正在使用我的api模块)api模块将导致ApiServerNotRespond
异常,那么例如调用not_respond
视图或仅调用myapp/not_respomd.html
模板。
我不想使用任何中间件,因为我希望所有配置都驻留在我的应用目录中而不是设置文件中。
我可以在何处以及如何定义自定义异常以及如何在引发自定义模板后强制它自动呈现?
答案 0 :(得分: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
答案 1 :(得分:0)
你可以做适当的异常,但是你需要用类似get_object_or_404()
的方式包含对模块函数的调用,所以每次发生异常时,你几乎都会重定向到错误页面。此外,所有对服务的调用都需要包装......
另一种方法是使用装饰器来处理服务的视图。然后,api函数调用将引发异常,装饰器将捕获它并呈现适当的页面(如login_required
装饰器)。 - 我选这个,更优雅:)。
无论哪种方式,您可能需要为服务提供某种包装调用,以便它实际上抛出异常。