如何在Django中触发500错误?

时间:2014-07-09 17:41:05

标签: python django

我正在尝试设置电子邮件错误记录,我想测试它。

在Django中触发500错误的简单方法是什么?令人惊讶的是,这里还没有讨论过。

3 个答案:

答案 0 :(得分:25)

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

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

答案 1 :(得分:3)

提高适当的Exception是最可靠的测试方法。如@agconti的答案一样,返回任何形式的HttpResponse都将不允许您测试错误 handling 的行为。您只会看到一个空白页。引发异常会触发正确的响应代码,并触发您期望的内部Django行为,并带有“真实”错误。

响应代码500表示服务器不知道要做什么。最简单的方法是写入测试或测试视图raise Exception('Make response code 500!')

除引发特定响应代码的异常外,还应引发其他大多数错误。这是您可能会提出的complete list of Django exceptions

答案 2 :(得分:1)

古老的问题,但我希望这对以后的人有所帮助。接受的答案并不能真正回答原始问题... 您可以通过引发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')

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