Python 如何获取纯文本Django错误页面

Python 如何获取纯文本Django错误页面,python,django,http,Python,Django,Http,在开发过程中,我在调试模式下运行Django,并使用文本模式应用程序将数据发布到我的应用程序中。理想情况下,当我得到http错误代码500时,我需要接收纯文本响应,这样我就不必在所有HTML和Javascript中查找真正的错误 有可能以纯文本形式获取Django 500内部服务器错误吗?我认为应该编写一个中间件,因为否则在500.html中就不会出现异常 有一个设置将强制Django不包装异常,这样您就可以看到它们,例如在devserver日志中。这是对Yuji答案的改进,它提供了堆栈跟踪、

在开发过程中,我在调试模式下运行Django,并使用文本模式应用程序将数据发布到我的应用程序中。理想情况下,当我得到http错误代码500时,我需要接收纯文本响应,这样我就不必在所有HTML和Javascript中查找真正的错误


有可能以纯文本形式获取Django 500内部服务器错误吗?

我认为应该编写一个中间件,因为否则在500.html中就不会出现异常


有一个设置将强制Django不包装异常,这样您就可以看到它们,例如在devserver日志中。

这是对Yuji答案的改进,它提供了堆栈跟踪、更多说明(对于Django新手)并且更简单

将此代码放在应用程序中的某个文件中,例如
PROJECT\u ROOT/MAIN\u APP/middleware/exceptions.py
,并确保在同一目录中有一个空的
\uu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuy

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\u 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)

如果在使用
curl
时正在寻找获取纯文本错误页面的方法,则 需要添加HTTP头
X-request-With
XMLHttpRequest
,例如

curl -H 'X-Requested-With: XMLHttpRequest' http://example.com/some/url/
说明:这是因为Django使用
is\u ajax
方法来确定是否以纯文本或HTML形式返回。
is\u ajax
依次查看
X-request-With


更新 自django版本3.1以来,错误报告将忽略
X-Requested-With
标头。相反,将请求上的
Accept
标头设置为不包含
text/html
mime类型的任何有效值

e、 g

在构建的基础上,我必须对其进行一些修改,以使其在Django 3.1中工作:

在应用程序中的某个位置创建一个文件,例如
your\u APP\u NAME/middleware/exceptions.py
,然后粘贴以下代码:

导入回溯
从django.http导入HttpResponse,HttpRequest
类PlainExceptions中间件:
定义初始化(自我,获取响应):
self.get\u response=get\u response
定义呼叫(自我,请求):
返回self.get_响应(请求)
def进程_异常(self,请求:HttpRequest,异常:exception):
如果request.META中的“HTTP\u USER\u AGENT”和request.META中的“chrome”[“HTTP\u USER\u AGENT”].lower():
返回
打印(traceback.format_exc())
返回HttpResponse(repr(异常),content_type=“text/plain”,status=500)
无需在
中间件
文件夹中创建
初始化.py
文件

settings.py
中,将以下项目添加到中间件变量的末尾,使其看起来像:

中间件=[
# ...
'您的应用程序名称。中间件。异常。PlainExceptionsMiddleware'
]

现在,如果“HTTP\u USER\u AGENT”和“chrome”在请求头中,该中间件不做任何事情,因此Django像往常一样返回HTML响应。否则,它将返回错误的纯文本表示作为响应(例如,
ValueError(“字段'id'预期为一个数字,但得到了'undefined')
)并将回溯打印到Django控制台,Django通常会这样做。当然,您可以将完整的回溯作为您的响应返回。

这很有效,谢谢。现在的问题是访问堆栈跟踪,因为“exception”只是一个常规的异常对象。恭喜!查看
sys.exc_info()
访问回溯。我建议直接查看django代码,该代码通常在
django.core.handlers.base中进行回溯格式设置,以实现您自己的版本。@Dmitry的答案更好,IMHO.simao,您能重新考虑哪一个答案是公认的吗?这似乎是正确且简单的方法ink不再工作。相反,如果您向Django服务器发出请求,它仍然会返回以HTML而不是明文形式包装的500错误。Django 2.0中删除了对中间件类的支持。对于现在的中间件类,您需要添加方法
def_uinit_uu(self,get_response):self.get\u response=get\u response
此中间件仍然返回HTML。似乎如果您甚至调用
traceback.format\u exc(exception)
,则
进程\u exception
的其余部分不会运行,因此异常会像往常一样以HTML格式返回。如果您只需执行
traceback.format\u exc()
,而不是在2020年传入
异常
,使用带有一些不包含“text/html”的值的“Accept”标题
curl -H 'X-Requested-With: XMLHttpRequest' http://example.com/some/url/
curl -H 'Accept: application/json;charset=utf-8' http://example.comp/some/url