溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Django View使用裝飾器捕獲數(shù)據(jù)庫連接異常

發(fā)布時(shí)間:2020-07-09 11:11:43 來源:網(wǎng)絡(luò) 閱讀:5319 作者:urey_pp 欄目:數(shù)據(jù)庫

“來不及解釋了”,直接上代碼。

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)

    如果因?yàn)閿?shù)據(jù)庫連接異?;蛘邤?shù)據(jù)庫上的原因?qū)е聉iew無法獲取數(shù)據(jù)庫中的內(nèi)容所產(chǎn)生的報(bào)錯(cuò)如果直接打印給用戶,則用戶可能一頭霧水,用戶體驗(yàn)很不友好。因此如果可能的話可以在應(yīng)用啟動(dòng)前一個(gè)簡(jiǎn)單的自檢,檢查數(shù)據(jù)庫是否可以正常連接等,但是這種檢查一般不夠細(xì)致到檢查數(shù)據(jù)庫中的某個(gè)表某個(gè)column是否存在,那么是時(shí)候該捕獲一下這些異常了。

    如果每一個(gè)view中的每一個(gè)與數(shù)據(jù)庫相關(guān)的def都去重復(fù)捕獲這些異常,顯然不是一個(gè)很好的做法。一個(gè)比較好的做法就是使用裝飾器來捕獲這些異常。裝飾器的寫法完全可以參照“from django.contrib.auth.decorators import login_required”中的寫法,本文的例子也是參照這一寫法。其實(shí)每一個(gè)種編程學(xué)習(xí)起來都是相似的,無論是Shell還是Python,自帶的方法中給出了很多好的示例供我們學(xué)習(xí),不重復(fù)制造輪子,站在巨人的肩膀上能看的更遠(yuǎn)!

tag:裝飾器捕獲異常,裝飾器,異常

--end--

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI