如何在Django中触发500错误?

48 投票
4 回答
49888 浏览
提问于 2025-04-18 12:40

我正在设置邮件错误日志,并想测试一下。

有没有简单的方法可以在Django中触发一个500错误?这个问题在这里居然还没有被讨论过。

4 个回答

0

如果你想要或者能够不使用自定义的 view 代码,这里有一个只用 urls.py 的变体:

# django urls.py

from django.urls import path
from django.views.defaults import server_error

urlpatterns = [
    path('500/', server_error),
]
8

这个问题虽然老了,但希望能对未来的某些人有所帮助。被接受的答案其实并没有真正回答最初的问题……

你可以通过抛出 ApiException 来轻松实现这一点,使用 Django 的 REST 框架:

from rest_framework.exceptions import APIException

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

这样做会让你的视图返回一个状态为 500 的响应。如果你在 API 中调用另一个函数,而不想处理这个函数的返回值来决定是否返回 500 状态的响应,这个方法就非常有用。

你可以这样使用:

raise ApiException

而在我写这段话时,默认的响应信息是“发生了服务器错误。”

有几个预定义的 ApiException 子类可以用来抛出不同类型的错误,如果你需要的错误不在其中,可以像这样扩展 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')

你也可以定义自定义的状态和详细信息,但在大多数情况下这样做意义不大。

编辑:

如果因为某种原因你在没有使用 DRF 的情况下工作,你可以直接复制 APIException 的代码,而不是安装 DRF 包:

https://github.com/encode/django-rest-framework/blob/4f7e9ed3bbb0fb3567884ef4e3d340bc2f77bc68/rest_framework/exceptions.py#L99

22

抛出一个合适的 Exception 是测试这个问题最可靠的方法。像 @agconti 提到的那样返回任何类型的 HttpResponse,都无法测试错误处理的行为。你只会看到一个空白页面。抛出一个异常会触发正确的响应代码,以及你在“真实”错误情况下期待的 Django 内部行为。

响应代码 500 表示服务器不知道该怎么处理。最简单的方法是在你的测试或测试视图中写 raise Exception('Make response code 500!')

其他大多数错误应该通过设计好的异常来抛出,以触发特定的响应代码。这里有一个 完整的 Django 异常列表,你可以根据需要抛出这些异常。

67

像这样的测试视图可以正常工作:

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

撰写回答