All articles, tagged with “ajax”

Удобная ловля 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;
}

Удобная обработка форм

В одной из предыдущих статей я писал о том, как лекго встроить ajax-валидацию форм [web-brains.com] в уже существующие виды с формами. Сегодня я придумал, как сделать это ещё проще.
 

AJAX-валидация форм

Краткая заметка о том как валидировать формы не перезагружая страницу в браузере.
Я делал всё на базисе слайдов с конференции Oscon - AJAX-формам там посвящены кадры с 67 по 84.
Слайды можно смотреть тут [toys.jacobian.org].