“来不及解释了”,直接上代码。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
from
django.shortcuts
import
render, redirect
from
models
import
Hosts
from
django
import
forms
# Create your views here.
def
database_error(request, message):
if
message
=
=
''
or
message
is
None
:
message
=
'Error detail is not given.'
context
=
{
'database_error'
: message,
}
return
render(request,
'exception/error.html'
, context)
def
database_error_decorator(func):
from
functools
import
wraps
from
django.utils.decorators
import
available_attrs
def
decorator(view_func):
@wraps(view_func, assigned
=
available_attrs(view_func))
def
_wrapped_view(request,
*
args,
*
*
kwargs):
try
:
return
view_func(request,
*
args,
*
*
kwargs)
except
Exception as e:
return
database_error(request, message
=
e.message)
return
_wrapped_view
return
decorator(func)
@database_error_decorator
def
list_hosts(request):
hosts
=
Hosts.objects.order_by(
'-hosts_hosts'
)
context
=
{
'hosts'
: hosts
}
return
render(request,
'inventory/hosts/list_hosts.html'
, context)
|
如果因为数据库连接异常或者数据库上的原因导致view无法获取数据库中的内容所产生的报错如果直接打印给用户,则用户可能一头雾水,用户体验很不友好。因此如果可能的话可以在应用启动前一个简单的自检,检查数据库是否可以正常连接等,但是这种检查一般不够细致到检查数据库中的某个表某个column是否存在,那么是时候该捕获一下这些异常了。
如果每一个view中的每一个与数据库相关的def都去重复捕获这些异常,显然不是一个很好的做法。一个比较好的做法就是使用装饰器来捕获这些异常。装饰器的写法完全可以参照“from django.contrib.auth.decorators import login_required”中的写法,本文的例子也是参照这一写法。其实每一个种编程学习起来都是相似的,无论是Shell还是Python,自带的方法中给出了很多好的示例供我们学习,不重复制造轮子,站在巨人的肩膀上能看的更远!
tag:装饰器捕获异常,装饰器,异常
--end--
本文转自 urey_pp 51CTO博客,原文链接:http://blog.51cto.com/dgd2010/1872599,如需转载请自行联系原作者