0

我正在 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)

我知道安全隐患,这就是为什么此处返回的消息与异常无关,而是在引发异常时由我们自己的代码生成(或在某些情况下提供的通用异常)。uuid 与堆栈跟踪、真正的异常信息等一起记录(最好记录到数据库,但如果不可能,则记录到文件)。用户可以在联系我们时通过 uuid 引用异常。

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

4

2 回答 2

2

我想返回一个带有 Json 主体的 Http 500 响应,以便客户端可以提取(除其他外)一个异常 uuid。

TBH,我不会依赖所有将非 200 响应视为有效 XHR 响应的 Web 浏览器,因此当您计划返回您希望浏览器解析的 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..
于 2013-04-16T12:43:41.107 回答
0

在您的ROOT_URLCONF即 urls.py 中添加一个名为handler500.

网址.py

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

我的应用程序/views.py

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

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

于 2013-04-16T16:09:21.160 回答