Django View使用装饰器捕获数据库连接异常

简介:

“来不及解释了”,直接上代码。

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,如需转载请自行联系原作者


相关文章
|
13天前
|
Kubernetes 关系型数据库 MySQL
ChaosBlade常见问题之数据库进行故障注入报错ibdata1文件异常如何解决
ChaosBlade 是一个开源的混沌工程实验工具,旨在通过模拟各种常见的硬件、软件、网络、应用等故障,帮助开发者在测试环境中验证系统的容错和自动恢复能力。以下是关于ChaosBlade的一些常见问题合集:
|
13天前
|
监控 Oracle 关系型数据库
Flink CDC(Change Data Capture)是一种用于捕获数据库变更的技术
Flink CDC(Change Data Capture)是一种用于捕获数据库变更的技术
44 8
|
13天前
|
存储 关系型数据库 MySQL
Python Django框架下将MySQL数据库的内容在网页上动态展示(修订版-2021-05-17)
Python Django框架下将MySQL数据库的内容在网页上动态展示(修订版-2021-05-17)
30632 0
|
5天前
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用合集之从Oracle数据库同步数据时,checkpoint恢复后无法捕获到任务暂停期间的变更日志,如何处理
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
13天前
|
前端开发 数据库 Python
使用 Python 的 Web 框架(如 Django 或 Flask)来建立后端接口,用于处理用户的请求,从数据库中查找答案并返回给前端界面
【1月更文挑战第13天】使用 Python 的 Web 框架(如 Django 或 Flask)来建立后端接口,用于处理用户的请求,从数据库中查找答案并返回给前端界面
105 7
|
13天前
|
Java 关系型数据库 MySQL
【JAVA进阶篇教学】第八篇:Java链接MySql数据库异常
【JAVA进阶篇教学】第八篇:Java链接MySql数据库异常
|
13天前
|
SQL 缓存 数据库
在Python Web开发过程中:数据库与缓存,如何使用ORM(例如Django ORM)执行查询并优化查询性能?
在Python Web开发中,使用ORM如Django ORM能简化数据库操作。为了优化查询性能,可以:选择合适索引,避免N+1查询(利用`select_related`和`prefetch_related`),批量读取数据(`iterator()`),使用缓存,分页查询,适时使用原生SQL,优化数据库配置,定期优化数据库并监控性能。这些策略能提升响应速度和用户体验。
21 0
|
13天前
|
SQL 数据库 开发者
Python Web 开发: 什么是 Django ORM?如何使用它进行数据库操作?
Python Web 开发: 什么是 Django ORM?如何使用它进行数据库操作?
|
13天前
|
关系型数据库 API 数据库
Django中的数据库事务管理:确保数据一致性
【4月更文挑战第15天】Django框架提供强大的数据库事务管理,确保ACID属性,保证数据一致性和完整性。文章深入讨论了Django事务管理,包括使用`@transaction.atomic`装饰器和`transaction.atomic()`上下文管理器手动控制事务,以及低级API进行精细管理。注意避免长时间事务、选择合适隔离级别、正确处理异常及了解数据库特性。掌握这些技巧对构建可靠Web应用至关重要。
|
13天前
|
SQL 自然语言处理 数据库连接
Django ORM的魔力:简化数据库操作与迁移
【4月更文挑战第15天】Django ORM是Django框架的关键部分,提供了一种高级的面向对象方式与数据库交互,简化了手动SQL操作。通过定义Python数据模型,开发者能轻松创建数据库表结构,使用ORM执行查询、添加、修改和删除数据。Django ORM还自动化处理数据库连接、事务和数据类型转换。当模型变化时,Django的迁移工具帮助管理数据库结构的更新。通过这种方式,Django ORM促进了高效、专注于业务逻辑的Web开发。