geekdoc-python-zh/docs/askpython/django-exception-handling.md

8.7 KiB

Django 异常处理——简单的操作方法

原文:https://www.askpython.com/django/django-exception-handling

在本文中,我们将以非常简洁的方式学习 Django 异常处理,同时涵盖 Django 中的大多数异常和错误消息。

为什么我们需要处理异常?

作为一名开发人员,您会在制作 web APIs、模板或编写任何其他代码时遇到各种各样的错误。

处理它们是一个非常耗时的过程,但也是一项必不可少的任务,因此这种异常和错误处理的关键技能就出现了。

什么是例外?

编码中的异常是那些导致不良事件的事件类型。这些是由运行时执行程序(如控制台和终端)或操作系统检测的。

它们不一定会停止整个程序,但会导致不希望的输出。

例如:

假设客户希望从数据库中看到一个特定的对象。但是由于某种原因,那个特定的对象不在那里。

在这种情况下,服务器不会停止,但是客户机会得到一个错误,因为对象不在 DB 中,这是不希望的。

异常和错误的主要区别

错误是指导致整个系统停止运行,程序无法执行的事件。

有错误什么也做不了;我们只能检测,然后做出适当的改变,使它们不会发生。

另一方面,异常是开发者可以处理的事情,而不会让系统停止。

Django 异常的类型

Exception Handling

Exception Handling

Django 中有很多种例外,其中五个是极其重要的和使用最频繁的。****

  • Django 异常类
  • Django URL 解析程序异常
  • Django 数据库异常
  • Django Http 异常
  • Django 交易异常

我们将详细了解它们。

1) Django 异常类

身份证明 例外 描述
one AppRegistryNotReady –当 Django 模型在 Django 应用程序本身之前加载时,就会出现这种情况。
–当您编写自己的脚本而不是使用默认的 Django 应用程序文件时,会出现此异常。
Two 对象目标神经学家 顾名思义,当对象不存在时发生。
three 经验值结果集 当查询返回空集时发生
four 字段不存在 当模型中不存在字段时,会出现这种情况。
five 返回了多个对象 当查询返回多个结果时,会出现这种情况
six 可疑操作 当客户端出于安全原因做了一些可疑的事情时,就会发生这种情况
seven 权限被拒绝 当用户试图执行不允许他执行的任务时发生
eight ViewDoesNotExist 当视图不存在时发生
nine 未使用的中间件 当 settings.py 的中间件部分没有使用特定的中间件时,就会出现这种情况
Ten 配置不正确 当 Django 配置不正确时,就会出现这种情况。在使用默认的 Django 文件时通常不会发生这种情况。
Eleven 字段错误 当模型字段中有错误时发生
Twelve 验证错误 当表单或模型表单中的数据验证失败时发生。

Django Exception classes

2) Django URL 解析器异常

身份证明 例外 描述
one 解析器 404 –由 Django.http.Http404 库的一部分函数 resolve() 引发。
–当路径()没有可映射的有效视图时出现异常。
Two 不匹配 当用户搜索错误的端点时,会出现这种情况。

Django URL Resolver Exceptions

3) Django 数据库异常

身份证明 例外 描述
one DatabaseError 当数据库不可用时发生
Two 完整性错误 –当 DB 需要某个字段的值,但没有从用户处获得该值时,会出现这种情况。
–如果为真, Django 将在数据库中将空值存储为 NULL。默认值为 False。
three 数据错误 因数据相关问题而发生

Django Database Exceptions

4) Django Http 异常

这一点我们已经见过很多次了。这些是我们从 django.http 库中导入的 HTTP 异常

身份证明 例外 描述
one UnreadablePostError 当用户取消上载时发生。

Django Http Exceptions

5) Django 交易异常

身份证明 例外 描述
one 交易管理错误 所有因数据库事务而出现的问题都会引发此问题

Django Transaction Exceptions

Django 应用中异常处理的简单实现

我们将在一个应用程序上执行一个简单的 DoesNotExist 异常处理,显示服务器中某个特定项目的信息。

该代码是 REST API 文章中构建的 Web 应用程序 itemsapp 的一部分。

Itemsapp 是一个简单的 REST API 应用程序,它允许客户端

  1. 查看服务器中存在的项目列表(获取端点:hostwebsite/items)
  2. 向数据库中添加一个新项目(POST 端点:hostwebsite/items)
  3. 查看特定项目(GET endpoint:hostwebsite/item/<id>)
  4. 编辑特定项目(PUT endpoint:host website/item/<id>)
  5. 删除特定项目(删除端点:hostwebsite/item/<id>)

要了解如何创建完整的 web 应用程序,请阅读 Rest API 文章。

现在我们将创建一个显示来自数据库的特定商品信息的网页

  • 在 models.py 中创建一个 ItemModel 来存储关于项目的信息:
from django.db import models

# Create your models here.

class ItemsModel(models.Model):
    id = models.IntegerField(primary_key = True)
    name = models.CharField(max_length = 80)
    price = models.IntegerField()

    class Meta:
        ordering = ['name']

    def __str__(self):
        return f"{self.name}:{self.price}"

  • 如上图所示, urls.py 中的 URL 路径将是:
path('/item/<int:nm>',Item)

现在只需通过管理网站添加一些项目到数据库中。

Admin

Admin

  • 现在在 views.py 中,显示带有 id = nm 的特定项目的代码将是:
def Item(request,nm):
        item = ItemModel.objects.get(id = nm)
        return HttpResponse(item)

运行服务器并检查 DB 中不存在的对象,比如说 id = 4

您将得到一条错误消息

DoesNotExist

DoesNotExist

现在我们将使用 Django 异常处理来处理这个错误。编辑 views.py 中的代码,如下所示:

def Item(request,nm):
        try:
            item = ItemsModel.objects.get(id = nm)
        except ItemsModel.DoesNotExist:
            return HttpResponse('Exception: Data Not Found')
        return HttpResponse(item)

注意除 ItemsModel 之外的行"。不存在”。这是 Python 自动捕获异常的地方。您可以用上面列表中的一个异常替换该异常,并用自定义错误消息处理该异常。

对于第一次进口

from django.core.exceptions import *

就这样,现在我们可以继续添加我们想要的异常

def Item(request,nm):
        try:
            item = ItemsModel.objects.get(id = nm)
        except ObjectDoesNotExist:
            print('Data Not Found')
        return HttpResponse(item)

现在运行服务器并搜索 id = 4

Exception Handling

Exception Handling

类似地,我们将处理来自 django.core.exceptions 的其他重要且最常用的异常

其他一些重要的例外

首先,我们必须导入库

from django.core.exceptions import <error_name>

让我们来看看重要的例外情况

字段不存在

当模型字段不存在时,会出现这种情况

try:
    Model.objects.get(<field> = '<value>')
except FieldDoesNotExist:
    print('The Field is missing')

返回了多个对象

当数据库中的多个对象对于某个字段具有相同的值时发生

try:
    Model.objects.get(<name> = '<value>')
except MultipleObjectsReturned:
    print('More than one object with the same name are present in the Database')

视图不存在

当我们通过 urls.py 中的 path() 调用一个视图,但是这个视图并不存在时,就会发生这种情况。

try:
    path('item/', <View>)
except ViewDoesNotExist:
    print('The View does not exist in views.py')

合法性错误

当表单数据中的某些信息无效时发生

data = form.cleaned_data['name']
if '<field_name>' not in data:
    raise ValidationError('This name does not exist')

结论

就这样,伙计们!我真的希望这篇文章有助于增加您对 Django 异常的知识和理解。更多信息请参考官方文档

注意安全!!继续学习!!