Удобная ловля AJAX ошибок
Вы пробовали отлаживать ошибки возникающие в обработчиках ajax-вызовах? Например, через firebug. Там можно посмотреть в мониторинге сети ответ ajax-запроса. Проблема в том, что когда случается ошибка в серверном коде, то django выбрасывает traceback в HTML-виде, который и приходится разглядывать в окошке firebug. При должной сноровке получается достаточно быстро форматировать мозгом этот html, но ощущение себя быдлом имеется.
Я сейчас придумал, одну штуку прикольную. Обычно как работают в django с ajax-вызовами — пишут декоратор, который наподобие render_to обрабатывает возвращаемый dict, только не строит по нему context объект, а просто сериализует в JSON-формат, лепит нужный content type и пуляет в браузер. Дык вот, можно в этом декораторе завернуть вызов view в try/except блок и в случае исключения, возвращать traceback. А далее уже можно разглядывать его тем же firebugом (он будет без html-форматирования или же делать alert в браузер. Вот такая идея.
Декоратор может быть чем-то вроде этого:
def ajax_request(func):
"""
Checks request.method is POST. Return error in JSON in other case.
If view returned dict, returns JsonResponse with this dict as content.
"""
def wrapper(request, *args, **kwargs):
if request.method == 'POST':
try:
response = func(request, *args, **kwargs)
except Exception, ex:
response = {'error': traceback.format_exc()}
else:
response = {'error': {'type': 403, 'message': 'Accepts only POST request'}}
if isinstance(response, dict):
return JsonResponse(response)
else:
return response
return wrapper
Ну и вот пример JS кода для алерта этого трейсбека:
function onSelectChange(select, movie_id) {
$.ajaxSetup({dataType: 'json', error: function(r, e) {alert(e)}});
args = {movie: movie_id, like: $(select).val()} ;
$.post('{% url mark_exists %}', args, function(data) {
if (data.error) {
alert(data.error);
}
});
return false;
}






Comments