2013-04-16 2 views
0

Я пишу несколько методов в Django, которые возвращают json. Я обрабатываю исключения самостоятельно и в определенных сценариях, я хочу вернуть ответ Http 500 с телом Json, чтобы клиент мог извлечь (среди прочего) Exception uuid.Полностью отключить шаблоны Http 404/500, когда Debug = False

Это работало отлично с 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-страницей, которую я не хочу или не нуждаюсь?

ответ

2

Я хочу, чтобы вернуть ответ HTTP 500 с кузовом Json таким образом, клиент может извлечь (помимо всего прочего) в Exception UUID.

ТВН, я бы не банк на всех веб-браузеров лечащих не-200 ответов как действительные ответы XHR, так что, вероятно, безопаснее всегда возвращает ответ 200, когда вы планируете возвращать ответ в формате JSON, который вы хотите браузер для синтаксического анализа.

Один общий способ сделать это - вернуть ту же структуру для всех ответов JSON, чтобы браузер мог определить, был ли вызов успешным или нет. Например, вы могли вернуть что-то вроде этого ...

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

... если он работал, и что-то вроде этого ...

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

... если это не удается. Для бонусных очков вы могли бы даже перевести исключение в исключение JavaScript и вернуть его к вызывающей функции.

Update

Для упрощения обработки, это намного проще, если все вызовы 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.. 
+0

Это Api, все вызовы выполняются либо через Ajax/не-браузерными клиентами - так что tbh меня особо не беспокоит, если браузеры покажут получившееся тело. Я уже начал использовать этот маршрут '({« Успех »: true,« Результат »: {...}}' или '({« Успех »: false,« Исключение »: {...}}', но это означает, что много javascript нужно проверять статусы, и гораздо чище разбить его на анонимные функции ajax '.success' и' .error' jQuery. Мне также нужно иметь возможность делать 401/403, если это необходимо, я бы сказал, что – Basic

+0

@Basic См. обновленный ответ – Aya

+0

Спасибо Aya, я подумал о чем-то подобном, если немного больше invovled (GET/POST, Postdata, функции обратного вызова и т. д.), и это определенная возможность +1 для мыслей, но я собираюсь провести некоторое время и посмотреть, смогу ли я остановить Django с страницами ошибок. – Basic

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, что вы возвращаете.

+0

Спасибо. Можете ли вы объяснить это мне? Мы специально добавляем обработчик 500, который возвращает запрос, но он никогда не будет привыкает? – Basic

Смежные вопросы