Если вы давно хотели попробовать писать юнит-тесты для своих проектов, но не могли пересилить лень, стремление к простоте или что-то еще, то у меня есть совет для вас. Попробуйте написать юнит-тесты для 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. К концу этой недели решили, что хорошо бы все эти действия выполнять одной командой. Я прошерстил ...
Интересные ссылки
Простое, гибко настраиваемое приложение для добавления 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.