Archive for August, 2008

Рефакторинг pydev.ru

Есть такой полудохлый сайт pydev.ru. Когда я только начинал изучать python и django я запустил этот сайт с наполеоновскими планами собрать там русскоязычное python community. Увы, как это всегда со мной бывает, энтузиазм пропал и я забил на сайт. Сегодня чё-то спонтанно захотелось поработать над сайтом. Как результат, добавил фид сообщений python блогосферы. Т.е. на сайте работал агрегатор сообщений из блогов питонеров и сегодня я прикрутил туда фид :-)

Получить ссылку на фид можно с этой страницы. Ну и на форум пообщаться заходите )

DjangoBeerSprintOmsk

Говорят вышел релиз джанги :-) Я точно не уверен, но все говорят. А значит, это повод выпить пива :-) Если вы живёте в Омске и знаете джангу, давайте пить пиво вместе! Мы пока ещё не определились где, но определились когда: во вторник, то бишь второго сентября.

На данный момент список потенциальных собутыльников такой:

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