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

时间:2011-02-07 12:16:05

标签: python django http

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

是否可以将Django 500内部服务器错误作为纯文本获取?

5 个答案:

答案 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控制台。当然,您可以改为返回完整的追溯作为您的响应。