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--編程

相關文章
相關標籤/搜索