[英]Django giving 500 instead of 404 for unknown URLs when debug is false
[英]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.