Удобная ловля 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;
}
Add post to:   Delicious Reddit Slashdot Digg Technorati Google
Make comment

Comments

No comments for this post

Required. 30 chars of fewer.

Required.

captcha image Please, enter symbols, which you see on the image