среда, 6 января 2010 г.

Релиз Django 1.2 Alpha

Сегодня случилось приятное событие и зарелизилась джанга 1.2 альфа.

Самые интересные нововведения:

1) Email-бэкенды
Появилась возможность указать бэкенд для отправления емэйлов, в стандартной поставке есть smtp/file/dummy/locmem/console бэкенды, и можно написать свой. Тестировать приложения намного приятнее.

2) -User Messages API +Messages Framework
User Messages API, тот который (user.message_set.create()) был выпилен, и ему на смену пришел фрэймворк messages из контриба.

3) Поддержка множественных баз данных (ура)
Теперь БД определяются следующим образом

DATABASES = {
'default': {
'NAME': 'app_data',
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'USER': 'postgres_user',
'PASSWORD': 's3krit'
},
'users': {
'NAME': 'user_data'
'ENGINE': 'django.db.backends.mysql',
'USER': 'mysql_user',
'PASSWORD': 'priv4te'
}
}

И соответственно при работе с ORM можно указать, какую из БД использовать.
Например так:


>>> Author.objects.using('default').all()
# This will run on the 'other' database
>>> Author.objects.using('other').all()
# Specify database on save
>>> user_obj.save(using='legacy_users')


До версии 1.4 старый способ объявления настроек БД выпилен не будет, и будут работать оба.

4) Еще одно очень приятное нововведение - умный if тэг в шаблонах.

Да, можно выкидывать smart_if.py, потому что теперь все его возможности идут из коробки.

5) django.template.loaders.cached.Loader

Лоадер для шаблонов, который кэширует результат загрузки с диска и компиляции шаблона.
По-умолчанию выключен.

6) Кастомная валидация моделей (и моделеформ на их базе)

Правда в Release Notes про нее не написано, но в транке она уже есть.

Все остальное не так ожидаемо (по моему личному мнению) и ознакомиться с этим можно по ссылке:
Release notes (django 1.2 alpha)

воскресенье, 24 мая 2009 г.

Отладка Django-приложений с помощью pdb

Когда я только начинал знакомство с Django/Python миром, для отладки я использовал что-то вроде
print var1, var2, var3
в нужном месте вида. Однако этот подход категорически неудобен, и я посмотрел в сторону pdb.

Читать дальше.

вторник, 12 мая 2009 г.

Последний редактор в admin

Хочу привести пример, как вывести последнего редактора объекта в админке.
Все действия над объектами в django.contrib.admin логируются моделью django.contrib.admin.models.LogEntry, поэтому нам достаточно просто найти последнее действие для выбранного объекта, и получить из него автора.
Пишем:

from django.utils.translation import ugettext_lazy as _
from django.contrib.admin.models import LogEntry
from django.contrib.contenttypes.models import ContentType

def last_editor(obj):
""" Return last editor for object """
ct = ContentType.objects.get_for_model(obj)
pk = obj.pk
l = LogEntry.objects.filter(content_type=ct, object_id=pk).order_by('-action_time')
if l.count():
l = l[0]
return '%s %s - %s' % (l.user.first_name or l.user.username,
l.user.last_name,
l.action_time.strftime('%d %h at %H:%M'))
else:
return _('Nobody or UFO')
last_editor.short_description = _('Last editor')

Подключаем в list_display необходимого ModelAdmin:

class PostAdmin(admin.ModelAdmin):
list_display = ('title', last_editor)

Открываем список постов в админке:

Только важно понимать, что редактирование объектов извне или изнутри приложения — не логируется, только через административный интерфейс.

Новое в транке Django 1.1

В Django 1.1 Beta 1 попало достаточно интересных вещей, одна из них — это действия над группой элементов в django.contrib.admin рассмотренная в прошлой записи.
Сейчас я хотел бы рассмотреть другие интересные изменения:

  • Новые методы QuerySetdefer, only
  • Редактируемые поля в списке объектов django.contrib.admin
  • "Неуправляемые" модели
  • Прокси модели

Читать дальше.

понедельник, 11 мая 2009 г.

Действия над группой объектов в django.contrib.admin

Не так давно, в джанго-админке появились Admin Actions (http://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/#ref-contrib-admin-actions). О них я и хотел бы сегодня рассказать. В процессе записи такие действия я буду называть AdminAction.

Что это, и зачем оно мне нужно?

На самом деле необходимость такой вещи назрела уже давно. Допустим я хочу удалить все объекты определенной модели из админки (представим, что у меня их ~100 штук), не имея доступа к базе данных. Задача превращается в довольно муторную, и во всех нормальных продуктах давно уже можно пару раз жмакнуть по галочке "Выделить все" и удалить все выделенное за следующие пару кликов. Поэтому выкручивались джангисты как могли. А теперь все просто.
Читать дальше.

Настройка окружения и развертка. Часть третья — lighttpd + mod_fastcgi + Flup

В данный момент самыми распространенными способами запуска django приложений, являются Apache + mod_python, и связка lightppd + mod_fastcgi + flup. Второй способ ест меньше ресурсов и в целом рекомендуется для маленьких и средних сайтов (сравнение lighttpd, apache). О нем я и буду рассказывать.
Читать дальше.

Настройка окружения и развертка. Часть вторая — Fabric

В первой части, был описан процесс создания виртуального окружения для нашего django-проекта. В этой части я хотел бы рассмотреть Fabric (http://www.nongnu.org/fab/) — программу для удаленного деплоймента.
Для того, чтобы начать нам нужен сам Fabric, установим его скачав с сайта (http://ftp.twaren.net/Unix/NonGNU/fab/), либо воспользуемся easy_install

sudo easy_install fabric

Если все прошло хорошо, можно продолжать.

Наш первый fabfile


Fabric — это утилита, которая логинится на удаленные сервера по ssh, умеет скачивать и загружать файлы. Работа с ней состоит из двух частей. Первая часть — сама программа fab. Вторая — fabfile, который говорит Fabric о том, что мы хотим сделать.
Читать дальше.