【问题标题】:Completely disable Http 404/500 templates when Debug=False当 Debug=False 时完全禁用 Http 404/500 模板
【发布时间】:2013-04-16 12:14:35
【问题描述】:

我正在 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 页面?

【问题讨论】:

    标签: python django exception


    【解决方案1】:

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

    TBH,我不会指望所有 Web 浏览器都将非 200 响应视为有效的 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..
    

    【讨论】:

    • 这是一个 Api,所有调用都是通过 Ajax / 由非浏览器客户端进行的 - 所以如果浏览器显示结果正文,我并不特别担心。我已经开始沿着({"Success": true, "Result": {...}}({"Success": false, "Exception": {...}} 这条路线走下去,但这意味着很多javascript 需要检查状态,并且将其拆分为jQuery 的ajax .success.error 匿名函数要干净得多。我还需要能够酌情执行 401/403,这意味着 more 状态检查。不过我确实同意你的观点
    • 谢谢 Aya,我考虑过类似的事情,如果涉及更多一点(GET/POST、Postdata、回调函数等),这是一个确定的可能性。 +1 的想法,但我会坚持一段时间,看看我是否可以阻止 Django 进入错误页面
    【解决方案2】:

    在您的 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 响应。

    【讨论】:

    • 谢谢。你能给我解释一下吗?我们专门添加了一个 500 处理程序,它返回一个请求但它从未被使用?
    猜你喜欢
    • 2019-11-04
    • 2018-11-24
    • 2021-08-13
    • 2018-03-20
    • 2015-05-10
    • 2021-11-05
    • 1970-01-01
    • 2020-06-25
    • 2014-11-05
    相关资源
    最近更新 更多