如何在Django中触发500错误?
我正在设置邮件错误日志,并想测试一下。
有没有简单的方法可以在Django中触发一个500错误?这个问题在这里居然还没有被讨论过。
4 个回答
如果你想要或者能够不使用自定义的 view
代码,这里有一个只用 urls.py
的变体:
# django urls.py
from django.urls import path
from django.views.defaults import server_error
urlpatterns = [
path('500/', server_error),
]
这个问题虽然老了,但希望能对未来的某些人有所帮助。被接受的答案其实并没有真正回答最初的问题……
你可以通过抛出 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 包:
抛出一个合适的 Exception
是测试这个问题最可靠的方法。像 @agconti 提到的那样返回任何类型的 HttpResponse
,都无法测试错误处理的行为。你只会看到一个空白页面。抛出一个异常会触发正确的响应代码,以及你在“真实”错误情况下期待的 Django 内部行为。
响应代码 500 表示服务器不知道该怎么处理。最简单的方法是在你的测试或测试视图中写 raise Exception('Make response code 500!')
。
其他大多数错误应该通过设计好的异常来抛出,以触发特定的响应代码。这里有一个 完整的 Django 异常列表,你可以根据需要抛出这些异常。
像这样的测试视图可以正常工作:
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()