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

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

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

时间: 2024-10-28 21:13:43

Django View使用装饰器捕获数据库连接异常的相关文章

Django中decorators装饰器的使用

1.CBV实现的登录视图 class LoginView(View): def get(self, request): """ 处理GET请求 """ return render(request, 'login.html') def post(self, request): """ 处理POST请求 """ user = request.POST.get('user') pwd = re

python装饰器实现对异常代码出现进行监控

异常,不应该存在,但是我们有时候会遇到这样的情况,比如我们监控服务器的时候,每一秒去采集一次信息,那么有一秒没有采集到我们想要的信息,但是下一秒采集到了, 而后每次的采集都能采集到,就那么一次采集不到,我们应该针对这一次采集不到进行分析吗,这种的情况可以说无法重复出现,我们也无法避免,因为外界的因素太多太多,我们无法去控制这些外面的因素,所以我们会有这样的需求,一段时间内出现频率多少次,我们才能显示一次报警,或者说,一段时间内出现的频率达到我们的异常许可范围我们认为这样的属于异常,我们可以发出报

Django基于Cookie装饰器实现用户认证

def login(request): if request.method =="GET": return render(request,"login.html") elif request.method == "POST": u = request.POST.get("user") p = request.POST.get("password") print(u,p) if u ==user and p

django权限验证装饰器

1.模型定义User from django.db import models from django.contrib.auth.models import BaseUserManager, AbstractBaseUser, PermissionsMixin from django.contrib.auth import get_user_model class UserManager(BaseUserManager): def _create_user(self , telephone, u

django登陆验证装饰器

登陆成功返回内层函数结果 outer(func):     wrapper(request, *args, **kwargs):         is_login = request.session.get(, )         is_login:             func(request, *args, **kwargs)         :             redirect()     wrapper

django session登录装饰器

def login_check(func): @wraps(func) def inner(request,*args,**kwargs): # ret = request.get_signed_cookie('is_login',default=0,salt='dsd',max_age=10) ret = request.session.get("is_login") if ret == '1': return func(request,*args,**kwargs) else: #

python django 自定义 装饰器

# -*-coding:utf-8-*- __author__ = "GILANG ([email protected])" """ django 自定义用于view的装饰器 """ from functools import wraps def object_does_not_exist(func): """ 不带参数的装饰器 """ @wraps(func) de

django view 装饰器

Django提供了几个可以应用于视图以支持各种HTTP特性的装饰器 Allowed HTTP django.views.decorators.http里的装饰器可以根据请求方法限制对视图的访问. require_http_methods 接收特定的HTPP 请求方法 from django.views.decorators.http import require_http_methods @require_http_methods(["GET", "POST"])

Django中间件,csrf校验和装饰器以及auth模块和部分功能

一.Django中间件 1).什么是中间件 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出.每个中间件组件都负责做一些特定的功能. 但是由于其影响的是全局,所以需要谨慎使用,使用不当会影响性能. 说的直白一点中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作,它本质上就是一个自定义类,类中定义了几个方法,Django框架会在请求的特定的时间去执行这些方法. 我们一直都在使用中间