python 如何在Django中触发500错误?

bhmjp9jg  于 2022-12-02  发布在  Python
关注(0)|答案(3)|浏览(125)

我正在尝试设置电子邮件错误日志记录,我想测试它。
在Django中触发500错误的简单方法是什么?令人惊讶的是这里还没有讨论这个。

mzaanser

mzaanser1#

这样的测试视图将起作用:

from django.http import HttpResponse

def my_test_500_view(request):
    # Return an "Internal Server Error" 500 response code.
    return HttpResponse(status=500)

或使用错误类中的烘焙:

from django.http import HttpResponseServerError
def my_test_500_view(request):
        # Return an "Internal Server Error" 500 response code.
        return HttpResponseServerError()
ccrfmcuu

ccrfmcuu2#

引发一个合适的Exception是最可靠的测试方法。返回一个任何类型的HttpResponse,如@agconti的答案,将不允许您测试错误处理的行为。您将只看到一个空白页面。引发一个异常将触发正确的响应代码和您所期望的“真实的”错误的Django内部行为。
响应代码500表示服务器不知道该做什么。最简单的方法是写入您的测试或测试视图raise Exception('Make response code 500!')
大多数其他的错误都应该通过设计用来触发特定响应代码的异常来引发。下面是Django可能引发的异常的完整列表。

zzoitvuj

zzoitvuj3#

老问题了,但我希望这对将来的人有所帮助。公认的答案并没有真正回答原来的问题...你可以通过抛出ApiException,在django rest框架中轻松地做到这一点:

from rest_framework.exceptions import APIException

try:
   ...
except ...:
    raise APIException('custom exception message')

这将从你的视图中返回一个状态为500的响应。如果你从你的API调用另一个函数,并且你不想管理这个函数的返回值来决定是否返回一个状态为500的响应,这将非常有用。你可以这样使用它:

raise ApiException

默认的响应消息(在编写本文档时)将是“发生服务器错误。”
有几个预定义的ApiException子类可以引发不同类型的错误,检查文件rest_framework.exceptions,如果你需要一个不在其中的子类,你可以像这样扩展ApiException:

from rest_framework.exceptions import APIException

class YourCustomApiExceptionName(APIException):
    def __init__(self, status, detail):
        self.status_code = status
        self.detail = detail

用法:

raise YourCustomApiExceptionName(100, 'continue')

您还可以定义自定义状态和详细信息,但在大多数情况下没有多大意义。

相关问题