当Debug = False时完全禁用Http 404/500模板

时间:2013-04-16 12:14:36

标签: python django exception

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

这适用于Debug = True,但设置为False时,以下代码会生成 html 错误页面...

Ret = {"ExceptionId:": "<Exception_uuid>",
       "Message": "Some user-friendly error message"}

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

我知道安全隐患,这就是为什么这里返回的Message与异常没有任何关系,而是在引发异常时由我们自己的代码生成(或者在某些情况下提供的通用代码)。 uuid被记录(理想情况下是数据库,但如果不可能则存档)以及堆栈跟踪,真实异常信息等。用户可以在联系我们时通过uuid引用异常。

如何强制django 而不是试图干扰我不想要或不需要的模糊html页面?

2 个答案:

答案 0 :(得分:2)

  

我想用Json身体返回一个Http 500响应   客户端可以提取(除其他外)一个异常uuid。

TBH,我不会将所有处理非200响应的Web浏览器作为有效的XHR响应,因此当您计划返回一个JSON响应时,总是返回200响应可能更安全希望浏览器解析。

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

{"result": "Hello, world!", "exception": null}

......如果有效,可以这样......

{"result": null, "exception": "You provided incorrect parameters"}

......如果失败了。对于奖励积分,您甚至可以将异常转换为JavaScript异常,并将其抛回调用函数。

<强>更新

为了简化处理,如果所有AJAX调用都通过单个函数进行路由,则会更容易。有点像...

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..

答案 1 :(得分:0)

ROOT_URLCONF即urls.py中添加名为handler500的属性。

urls.py

....
....
handler500 = 'myapp.views.get500handler'

的myapp / views.py

def get500h(request):
    return HttpResponse("A server error ocurred")

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