首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当Debug=False完全禁用HTTP404/500个模板时

当Debug=False完全禁用HTTP404/500个模板时
EN

Stack Overflow用户
提问于 2013-04-16 12:14:35
回答 2查看 203关注 0票数 0

我正在用Django编写一些返回json的方法。我自己处理异常,在某些情况下,我希望返回一个带有Json主体的Http 500响应,以便客户机能够提取(除其他外)一个异常uuid。

这在Debug = True中很好,但是当设置为False时,下面的代码会导致html错误页面.

代码语言:javascript
运行
复制
Ret = {"ExceptionId:": "<Exception_uuid>",
       "Message": "Some user-friendly error message"}

return HttpResponse(json.dumps(Ret), content_type="application/json", status=INTERNAL_SERVER_ERROR)

我知道安全性的影响,这就是为什么这里返回的消息与异常无关,而是由我们自己的代码在引发异常(或在某些情况下提供的一般异常)时生成的。uuid与堆栈跟踪、真正的异常信息等一起记录(理想情况下是数据库,但如果不可能)。当与我们联系时,用户可以引用uuid的异常。

我怎么能强迫django不去干扰我不想要或者不需要的模糊html页面呢?

EN

回答 2

Stack Overflow用户

发布于 2013-04-16 12:43:41

我希望返回一个带有Json主体的Http 500响应,这样客户机就可以提取一个异常uuid (除其他外)。

TBH,我不会在所有web浏览器上将非200响应视为有效的XHR响应,所以在计划返回希望浏览器解析的JSON响应时,始终返回200个响应可能更安全。

一种常见的方法是为所有JSON响应返回相同的结构,这样浏览器就可以确定调用是否成功。例如,你可以退回这样的东西..。

代码语言:javascript
运行
复制
{"result": "Hello, world!", "exception": null}

...if成功了,就像这样.

代码语言:javascript
运行
复制
{"result": null, "exception": "You provided incorrect parameters"}

...if它失败了。为了获得额外的积分,您甚至可以将异常转换为JavaScript异常,并将其抛回调用函数。

更新

为了简化处理,如果您的所有AJAX调用都是通过一个函数路由的话,就会简单得多。就像..。

代码语言:javascript
运行
复制
function do_json_call(url)
{
    var json = null;
    // code to get JSON via XHR here
    var result = json['result'];
    var exc = json['exception'];
    if (exc !== null)
    {
        throw exc;
    }
    return result;
}

function func1()
{
    try
    {
        var result = do_json_call("http://localhost/json/func1");
        // Do something
    }
    catch (e)
    {
        alert(e);
    }
}

function func2()
{
    try
    {
        var result = do_json_call("http://localhost/json/func2");
        // Do something
    }
    catch (e)
    {
        alert(e);
    }
}

// etc..
票数 2
EN

Stack Overflow用户

发布于 2013-04-16 16:09:21

在您的ROOT_URLCONF i.e urls.py中添加一个名为handler500的属性。

urls.py

代码语言:javascript
运行
复制
....
....
handler500 = 'myapp.views.get500handler'

myapp/views.py

代码语言:javascript
运行
复制
def get500h(request):
    return HttpResponse("A server error ocurred")

不要担心我们从get500h()返回的内容,您的用户仍然会看到您返回的json响应。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16036802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档