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

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

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是否存在,那么是时候该捕获一下这些异常了。python

    若是每个view中的每个与数据库相关的def都去重复捕获这些异常,显然不是一个很好的作法。一个比较好的作法就是使用装饰器来捕获这些异常。装饰器的写法彻底能够参照“from django.contrib.auth.decorators import login_required”中的写法,本文的例子也是参照这一写法。其实每个种编程学习起来都是类似的,不管是Shell仍是Python,自带的方法中给出了不少好的示例供咱们学习,不重复制造轮子,站在巨人的肩膀上能看的更远!数据库

tag:装饰器捕获异常,装饰器,异常django

--end--编程

相关文章
相关标签/搜索