Django的HttpResponse状态与status_code有何不同?

jaql4c8m  于 2023-01-21  发布在  Go
关注(0)|答案(2)|浏览(188)

我尝试在Django应用程序中设置一些自定义错误视图,但是我遇到了一些关于HttpResponse工作方式的问题。
当我返回HttpResponse(status=500)时,Django没有渲染500.html模板,但是当我使用status_codeHttpResponse(status_code=500)返回时,它可以工作。
下面是解决我的问题的步骤:
1.设置handler500 = views.handler500
1.构建handler500视图:

def handler500(request):
    return render(request, '500.html', status=500)

1.尝试复制500错误:

def cart(request):
    return HttpResponse(status=500)

我试图避免将现有代码库中的数百个视图从status=500重构为status_code=500,我担心会破坏某些东西,更重要的是,我试图理解两者之间的区别。
当我阅读www.example.com的Django源代码时response.py,似乎他们在class HttpResponseBase内将status转换为status_code

x8goxv8g

x8goxv8g1#

返回HttpResponse(状态=500)

返回HttpResponse(status=500)只会发送HTTP状态码为500的响应,但不会触发对错误处理程序的调用。请参考相关问题:How does HttpResponse(status=) work in django?
如果你想复制一个500错误,最简单的方法就是在你的视图中引发一个未处理的异常,例如:

def cart(request):
    raise Exception()

为什么返回HttpResponse(status_code=500)会触发对错误处理程序的调用

HttpResponse __init__()方法不接受关键字参数status_code。尝试通过调用HttpResponse(status_code=500)创建HttpResponse示例将引发异常:
TypeError:init()获得意外的关键字参数status_code
如果没有处理,错误处理程序(如果设置了,则为自定义,否则为默认)将被调用来处理异常并呈现500.html页面。
请参考django文档:https://docs.djangoproject.com/en/4.1/ref/views/#the-500-server-error-view
Django会在视图代码出现运行时错误时执行特殊的行为,如果视图出现异常,Django默认调用视图django.views.defaults.server_error,这会产生一个“服务器错误”消息,或者加载并渲染模板500.html(如果模板是在根模板目录下创建的)。

r8uurelv

r8uurelv2#

HttpResponse需要的参数是status=<int>,正如您所注意到的,它被转换为属性httpresonse.status_code,然而,所有这些都使responseheader包含一个500错误代码。
handler500是在视图中出现错误时调用的,它实际上并不是由响应头中的500错误代码触发的。
我怀疑在视图中使用意外的关键字参数status_code = <int>会导致handler500被调用所必需的错误。事实上,这是您想要的错误,这会使情况变得混乱。您可以通过将其设置为status_code = 404来验证这一点,并查看是否仍然会得到500响应。

相关问题