在开发期间,我在调试模式下运行Django,我使用文本模式应用程序将数据发布到我的应用程序。理想情况下,当我收到http错误代码500时,我需要收到纯文本响应,因此我不必在HTML和Javascript中查找真正的错误。
是否可以将Django 500内部服务器错误作为纯文本获取?
答案 0 :(得分:19)
如果您正在寻找使用curl
时获取纯文本错误页面的方法,那么您
需要添加值为X-Requested-With
的HTTP标头XMLHttpRequest
,例如
curl -H 'X-Requested-With: XMLHttpRequest' http://example.com/some/url/
说明:这是因为Django使用is_ajax
方法来确定是以纯文本还是以HTML格式返回。 is_ajax
反过来查看X-Requested-With
。
答案 1 :(得分:9)
有一个设置DEBUG_PROPAGATE_EXCEPTIONS会强制Django不包装异常,所以你可以看到它们,例如在devserver日志中。
答案 2 :(得分:8)
我认为要编写一个中间件,否则500.html中没有该例外
http://docs.djangoproject.com/en/dev/topics/http/middleware/#process-exception
class ProcessExceptionMiddleware(object):
def process_exception(self, request, exception):
t = Template("500 Error: {{ exception }}")
response_html = t.render(Context({'exception' : exception }))
response = http.HttpResponse(response_html)
response.status_code = 500
return response
答案 3 :(得分:1)
这是对Yuji的回答的改进,它提供了一个堆栈跟踪,更多指令(对于我们django新手)并且更简单。
将此代码放在应用程序中的某个文件中,例如PROJECT_ROOT/MAIN_APP/middleware/exceptions.py
,并确保在同一目录中有一个空的__init__.py
。
import traceback
from django.http import HttpResponse
class PlainExceptionsMiddleware(object):
def process_exception(self, request, exception):
return HttpResponse(traceback.format_exc(exception), content_type="text/plain", status=500)
现在编辑settings.py
并找到MIDDLEWARE_CLASSES = (
。添加另一个条目,如下所示:
MIDDLEWARE_CLASSES = (
# (all the previous entries)
# Plain text exception pages.
'MAIN_APP.middleware.exceptions.PlainExceptionsMiddleware',
)
重启django,你很高兴!
如果您像我一样开发一个由django支持的应用程序和网站,您可能希望向应用程序显示纯文本错误页面,并向浏览器显示格式错误的页面。一个简单的方法是检查用户代理:
import traceback
from django.http import HttpResponse
class PlainExceptionsMiddleware(object):
def process_exception(self, request, exception):
if "HTTP_USER_AGENT" in request.META and "chrome" in request.META["HTTP_USER_AGENT"].lower():
return
return HttpResponse(traceback.format_exc(exception), content_type="text/plain", status=500)
答案 4 :(得分:0)
在Timmmm's answer的基础上,我不得不对其进行一些修改才能在Django 3.1中工作:
在应用程序中的某个位置创建文件,例如YOUR_APP_NAME/middleware/exceptions.py
,然后粘贴以下代码:
import traceback
from django.http import HttpResponse, HttpRequest
class PlainExceptionsMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
return self.get_response(request)
def process_exception(self, request: HttpRequest, exception: Exception):
if "HTTP_USER_AGENT" in request.META and "chrome" in request.META["HTTP_USER_AGENT"].lower():
return
print(traceback.format_exc())
return HttpResponse(repr(exception), content_type="text/plain", status=500)
没有必要在__init__.py
文件夹中创建middleware
文件。
在settings.py
中,将以下项目添加到MIDDLEWARE变量的末尾,使其看起来像:
MIDDLEWARE = [
# ...
'YOUR_APP_NAME.middleware.exceptions.PlainExceptionsMiddleware'
]
现在,如果请求标头中包含“ HTTP_USER_AGENT”和“ chrome”,则此中间件不会执行任何操作,因此Django会照常返回HTML响应。否则,它将返回错误的纯文本表示作为响应(例如ValueError("Field 'id' expected a number but got 'undefined'.")
),并像Django通常那样将回溯结果打印出到Django控制台。当然,您可以改为返回完整的追溯作为您的响应。