
Понедельничной ночью 1-го августа, примерно в 03:30 пять человек потихоньку укладывали ноутбуки в свои рюкзаки и выходили из офиса чтобы разъехаться по домам. Кто-то на такси, кто-то на своей машине. Еще трое ушли несколькими часами раньше. Закончились двое суток напряженного труда над созданием проектов в рамках конкурса Django Dash ...
Django Dash - международный конкурс, в котором компактные спецназ-команды за 48 часов создают полноценный проект. Правила простые:
- бОльшая часть кода должна использовать django
- никакого кода до соревнования (только идеи и бумажные прототипы)
- команда не больше 3 человек
- git или mercurial для хранения исходных кодов
- ваш проект должен быть open source
- можно ...
Недавно я писал про то, как работать с документами LibreOffice из питона. Я сейчас работаю над исследовательским проектом, в котором django application обращается к LibreOffice через pyuno. В этом проекте натолкнулся на неприятную ошибку - ./manage.py shell при выполнении любых связанных с pyuno методов выдает сообщение "SystemError: pyuno runtime is ...
В проекте Grammarly Handbook, про который я писал вчера, грамматические карточки из формата MS Word нужно было конвертировать в какой-то внутренний формат, чтобы в этом формате было легко добавлять новые карточки и редактировать существующие. Кроме того, нужно было ограничить функционал редактора карточек, чтобы не было чрезмерного разнообразия форматирования и, как ...
Наконец-то я понял, почему пишут так
def item_view(request, id):
item = get_object_or_404(Item, id=id)
if request.method == 'POST':
form = ItemForm(request.POST, instance=answer)
if form.is_valid():
form.save()
return HttpResponseRedirect(item.get_absolute_url())
else:
form = ItemForm(instance=item)
return render('item.html', {'item': item, 'form': form})
и не пишут ...
В новом проекте я много работаю в роли дизайнера-юзабилиста-фронтендщика. Пишу html, css, javascript. Думаю страницами, действиями, приоритетами. Хочу поделиться тем, что я успел увидеть глазами дизайнера в оформлении шаблонов страниц сайта.
Не уходить далеко от html, css
В случае статического сайта каждая страница - это один html файл. Это очень удобно ...
Если вы давно хотели попробовать писать юнит-тесты для своих проектов, но не могли пересилить лень, стремление к простоте или что-то еще, то у меня есть совет для вас. Попробуйте написать юнит-тесты для API - тех вьюх, которые не открыть в браузере, не протестить глазами и мышкой. Особенно это касается API, которое ...
Пока проверял как Celery работает с MySQL в качестве брокера, материала набежало на большую статью. Сергей Лебедев, спасибо за этот замечательный вопрос!
Проблемная область
В каждом более-менее крупном веб-проекте появляются задачи, которые не укладываются в короткий цикл запроса-ответа HTTP. Отправка уведомлений по почте - сервер может не отвечать 20 секунд, зачем ...
Есть 2 задачи, связанные с .css и .js файлами, которые возникают при регулярном деплойменте веб-проектов. Первая - минимизация размера. Есть много утилит, позволяющих убрать комментарии и лишние пробелы, тем самым сократив размер файла, который скачивает браузер клиента. Вторая - версионирование. Если у вас файл со стилями доступен по ссылке /media/css/main ...
Определяем в питоновском коде задачи, которые должны выполняться асинхронно:
from celery.decorators import task
@task
def add(x, y):
return x + y
Запускаем несколько обработчиков на разных серверах (все они связываются брокером, в качестве которого может выступать RabbitMQ, Stomp, Redis и большинство современных СУБД)
Запускаем задачу на асинхронное выполнение:
result ...
Неделю-две назад понадобилось мне сделать динамическую форму на Django - чтобы её поля создавались и настраивались в зависимости от данных, передаваемых в конструктор. Изучив исходники, я обнаружил, что сделать это легче легкого:
class DynamicForm(forms.Form):
def __init__(self, some_data, *args, **kwargs):
super(DynamicForm, self).__init__(*args, **kwargs)
for i, requisite ...
В питоне есть 2 очень мощных инструмента мета-программирования: декораторы и метаклассы. Декораторы применяются к функциям, метаклассы - к классам. Хочу подробно остановиться на декораторах.
Что это такое
Классический пример декоратора - render_to:
def render_to(template):
def renderer(func):
def wrapper(request, *args, **kw):
output = func(request, *args, **kw)
if isinstance(output, (list ...
- Не нужно ставить точки с запятыми и фигурные скобки повсюду (радует еще больше, чем при переходе с begin-end Паскаля к фигурным скобкам C).
- Очень легко читать чужой код (из-за п.1, стандартизированных отступов, компактности языка, а также благодаря специальному упору на читаемость в дизайне языка). По сравнению с C/C ...
В django есть хорошее встроенное приложение comments с поддержкой модерации. Сегодня написал AkismetModerator - крохотный класс, который фильтрует спам в комментариях с помощью сервиса Akismet:
from akismet import Akismet
from django.contrib.comments.moderation import CommentModerator, moderator
from django.utils.encoding import smart_str
class AkismetModerator(CommentModerator):
def moderate(self, comment, content_object ...

В джанге многое сразу покорило мое сердце - прекрасные модели, мощный URLconf, красивые шаблоны. Но вот джанго-формы открылись для меня во всей красе лишь недавно. Я быстро научился верстать и обрабатывать формы руками, поэтому не было надобности вникать в довольно большой посвященный им раздел документации (10 разделов!). В новом большом django-проекте ...
Потребовалось мне на днях сделать сериализацию простого Python-dictionary в XML. Элементы словаря - списки и прочие объекты. Готового сниппета я не нашел, написал свой компактный (меньше 30 строчек) сериализатор.
from StringIO import StringIO
from xml.etree.cElementTree import Element, ElementTree
try:
from django.utils.encoding import smart_unicode as unicode
except:
pass ...
В одном из проектов необходимо регулярно выкладывать код из ветки stage на staging сервер. Начали делать это вручную - входишь через ssh, делаешь git push origin stage, если нужно - обновляешь базу и затем перезапускаешь apache. К концу этой недели решили, что хорошо бы все эти действия выполнять одной командой. Я прошерстил ...
Интересные ссылки
А вот и видео с DjangoCon Europe подоспели. Их по традиции выложили на blip.tv (в отличии от Europython, которые выложили на амазоновский cloudfront).
Обновил в соответствии с новыми фичами Django 1.3, подчистил и выложил в открытый доступ код этого блога.
Очень простое django app, которое делает "Sign in with Twitter".
Альтарнативный способ написания юниттестов. Если кратко, то в большинстве случаев можно просто писать assert f(a, b, c) = 123 и все равно получать полные сообщения об ошибках. Есть интеграция с django - django-pytest. Via convore
Стас Крвсс про свой форк django-social-auth, который поддерживает дополнительно Yandex OpenID, ЖЖ, Вконтакте.
Преимущество TestCase.assertEqual(status, 200) vs. assert status == 200 в том, что сообщение об ошибке выдается более информативное: AssertionError: 302 != 200 vs AssertionError.
"PEP 444 is a moving target as people still want to keep changing it and no one agrees about it. PEP 3333 isn't going to change and is what Apache/mod_wsgi has supported for the last two years. CherryPy WSGI server and uWSGI are also PEP 3333 compliant for Python 3." Graham Dumpleton
"If you need to get the content of the block from the parent template, the {{ block.super }} variable will do the trick. This is useful if you want to add to the contents of a parent block instead of completely overriding it. Data inserted using {{ block.super }} will not be automatically escaped (see the next section), since it was already escaped, if necessary, in the parent template."
А я как-то просмотрел эту возможность. Источник - reddit
Пакет вспомогательных инструментов тестирования для django-проектов. Testmaker записывает тесты, пока вы кликаете мышкой по сайту, Crawler проходит по всем URL-ам, которые может найти на сайте, Persistent Database Test Runner выполняет тесты, не пересоздавая тестовую базу. А также Twill Runner и Mock Objects.
PyFlakes запускается при сохранении файла и по Cmd-Shift-V (или Option-Shift-V, смотрите Bundles -> Python Tools Bundle). У себя установил, очень доволен! PS. Кто не читает еще блог Дэвида Крэмера - рекомендую подписаться.
Функция, которой мне так горячо не хватало, оказывается живет себе тихонько начиная с Django 1.0 ;))) Передаете ей результат reverse, а она добавляет протокол (request.is_secure) и имя хоста (request.get_host).
Jacob Kaplan-Moss и Frank Wiles (а также другие известные питонисты) отвечают на вопросы, связанные с django.
Подход к хранению древовидных данных в реляционной базе данных от P.J. Eby. Используется closure table, хранящая parent_id, child_id, depth. Получение дерева - за один sql-запрос (с join'ом к closure table).
В Google App Engine будет SQL-подобный интерфейс к BigTable. А в django скорее всего будет хороший db-backend к нему. Результат - можно будет использовать django в Google App Engine без лишних патчей.
Изменения в процессе разработки django по мотивам обсуждений на DjangoCon 2010 (в том числе - Why django sucks and how we can fix it
Мне понравился ход с TEMPLATE_TAGS - добавлю его в текущий проект, чтобы не прописывать часто {% load something_tags %}. local_settings.py используем давно и довольны
Москва, отличный офис на м. Китай-город, креативные сильные ребята в команде, хорошие основатели-руководители. Собственные прорывные проекты (один из них - http://bookmate.ru). Работать вместе с Димой Смолиным (одним из лучших программистов, с кем я когда-либо работал).
Линки на слайды со всех выступлений на DjangoCon 2010 в Portland (для тех кто не читает reddit.com ;))
Снова слайды с DjangoCon 2010. Очень непростая тема. См также обсуждение на hacker news, объяснение про закрытый список рассылки в django-dev.
Django-app для логина через Google, Facebook, Twitter, Yahoo!, LinkedIn или произвольный OpenID provider. Это - ссылка на самую активную ветку (и похоже - ветку разработчиков из Hyderabad, India), есть еще десяток активных репозиториев, которые посылают много pull requests.
Про то как ребята из Disqus справляются с высокой нагрузкой (17 000 запросов в секунду). Используют Python/Django/Postres. Написали/дописали хорошие инструменты, поддерживающие процесс разработки.
Простое, гибко настраиваемое приложение для добавления captcha в формы
"Hidden Hires was founded by Django developers trying to make hiring within open source communities awesome. Companies win when they can hire the best open source developers; developers win when they get to work for the best companies. We're trying to make that happen."
"Postgres’ site now is apparently generated from a bespoke PHP script mishmash. Josh said that tasks like creating new forms was much harder than they ought to be. So…they’re moving it to Django."
uWSGI
01.06.2010
uWSGI is a fast (pure C), self-healing, developer-friendly WSGI server, aimed for professional python webapps deployment and development (есть модули для apache2, nginx, cherokee и lighttpd)
Еще одна схема разделения django-проекта на директории-поддиректории, специфичные для делоймента настройки и т.д. (via Simon Willison)
Дима пишет: "В кои-то веки сделал Python реализацию Enum, которая мне нравится :) Опыт использования показал, что пользоваться очень удобно :) Идея трюка с определением порядка атрибутов класса сперта из Django. Мы используем строковые константы, но если кому-то нужна числовая автонумерация - код очень легко дополнить"
В одной компании было 2 команды: одна писала на C#, другая на Python. Прежде чем сделать окончательный переход на Python+Django для веб-приложений, они 6 месяцев проводили измерения скорости разработки в обоих командах. По их измерениям, Python+Django разработчик заменяет двоих разработчиков на C#+ASP.NET
Q: When will Django finally have every feature I want?
A: "Ambition has its disappointments to sour us, but never the good fortune to satisfy us."
(спасибо Толику Вострякову за наводку!)
Сегодня делаем большой рефакторинг проекта, в частности разносим модели по разным приложениям. Нашел отличную инструкцию по написании south migrations для этого случая.
Выложили чуть-чуть исправленную версию django-markitup - воркараунд бага #12882. Автор изменений - Михаил Корнеев
Django Lint is a static analysis tool that checks (or "lints") projects and applications that use the Django web development framework. It reports on common programming errors and bad code smells, including checking for nullable CharField field types, the use of brittle or deprecated Django features (such as auto_now_add) as well as the absence of recommended options in settings.py. It aims to encourage the development of high-quality re-usable Django applications.
Лучший инструмент для django-миграций. Мы использовали недавно его прямо из транка (потому что версия 0.6.x не поддерживала multi-db), и даже тогда он был вполне себе рабочим инструментом. А сейчас он стал еще стабильнее. Andrew Godwin, ура!
Юрий Юревич пишет: "Есть один интересный человек, Янис Ляйдель, также известный под ником jezdez. Помимо всего прочего (Pinax & Django core dev, ключевая фигура в немецком Django-коммунити), он известен коллекционированием полезных Django-приложений. Рекомендую посмотреть список “зафоловленных” им приложений на GitHub и Bitbucket, возможно найдете что-нибудь интересное."
Набор лучших практик от ребят из Chicago Tribune: version control, python, django, javascript, html/css, images, testing.
Людвиг - отличный питонист из Швеции. Одна из его библиотек, pylibmc, скорее всего будет использоваться в django.
Особенно понравилось про daemontools. Если кто-то еще не читает Django Advent - рекомендую начать читать :)))
"Живой опыт программирования, Python, Django, современные языки и немного фотографий" - много работал с Толиком, даже на питоне вместе от души попрограммировали. Отличный человек и программист, а сейчас еще и блоггер. Рекомендую читать!
django-devserver provides a simple drop-in runserver replacement. It allows you to run a command, python manage.py rundevserver, and to get some additional information. As of writing, that additional information includes real-time SQL logging (aka mass query spam in your terminal), and a summary of cache calls.
django-app для серверной и клиентской обработки pingbacks (уведомлений о том, что на ваш материал поставили ссылку где-то там в вебе)
Толик Востряков пишет про библиотеку Coverage, показывающую покрытие тестами python/django кода
Разработчики из ядра проекта Django рассказывают о технических решениях, лежащих в основе фреймворка. PS. Отличная возможность посмотреть на людей, которых вы (скорее всего) так много читали :)))
Толик Востряков выложил код cache-бэкэнда для Django, который хранит данные в Tokyo Tyrant. Подробности - в блоге Толика
Первый программистский пост Толика Вострякова. 1. MultiTextInputWidget - виджет для формы, представляющий json-поле из базы данных в виде нескольких полей на форме. 2. Разные способы определения свойств в Python
Сегодня ночью в django trunk закомиттили multi-db patch. Ура, Alex Gaynor и все-все-все!
Дополнительные команды manage.py для визуализации моделей и отношений между ними, ajax-отладки, db-agnostic экспорта-импорта данных и многого другого. Для Mac OS X рекомендую ставить через порты - sudo port install py26-django-extensions py26-pygraphviz py26-werkzeug. См. также
скринкаст
Part1 и
Part 2 - в последние месяцы в блогах о Python и Django много пишут про
Fabric, инструмент позволяющий автоматизировать деплоймент Python-проектов.
По умолчанию все сессии Django хранит в базе данных. Чтобы снять нагрузку на базу, сессии лучше хранить в чем-то побыстрее и проще - memcached (есть в составе django), tokyo-tyrant (есть библиотека django-tokyo-sessions) или redis. Я думаю, что redis будет немного быстрее чем tokyo-tyrant и лишь чуть менее надежнее в плане сохранности сессий (сохранение данных на диск в redis производится асинхронно)
The goal of self-contained apps is that you can basically plug a few apps together, write a few lines to connect everything, and get your website finished as quickly as possible.