簡體   English   中英

當Debug = False時完全禁用Http 404/500模板

[英]Completely disable Http 404/500 templates when Debug=False

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

我想用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..

在您的ROOT_URLCONF即urls.py中添加名為handler500的屬性。

urls.py

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

MYAPP / views.py

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

不要擔心我們從get500h()返回的get500h() ,您的用戶仍會看到您要返回的json響應。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM