Примечания к выпуску Django версии 0.96

Добро пожаловать в Django 0.96!

Основной целью 0.96 является очистка и стабилизация функций, представленных в 0.95. С 0.95 было сделано несколько небольших backwards-incompatible changes, но процесс обновления должен быть достаточно простым и не требовать серьезных изменений в существующих приложениях.

Однако мы также выпускаем 0.96 сейчас, потому что на ближайшее время запланирован ряд изменений, несовместимых с обратным развитием. После завершения они повлекут за собой некоторые изменения кода для разработчиков приложений, поэтому мы рекомендуем вам придерживаться Django 0.96 до следующего официального релиза; тогда вы сможете обновиться одним шагом, а не вносить постепенные изменения, чтобы идти в ногу с версией разработки Django.

Обратно-несовместимые изменения

Следующие изменения могут потребовать от вас обновления кода при переходе с 0.95 на 0.96:

MySQLdb требование к версии

Из-за ошибки в старых версиях модуля MySQLdb Python (который Django использует для подключения к базам данных MySQL), бэкенд MySQL в Django теперь требует версию 1.2.1p2 или выше MySQLdb, и будет вызывать исключения, если вы попытаетесь использовать более старую версию.

Если вы не можете обновить свою копию MySQLdb до соответствия этому требованию, в Django был добавлен отдельный, обратно совместимый бэкенд под названием «mysql_old». Чтобы использовать этот бэкенд, измените параметр DATABASE_ENGINE в вашем файле настроек Django следующим образом:

DATABASE_ENGINE = "mysql"

к этому:

DATABASE_ENGINE = "mysql_old"

Однако мы настоятельно рекомендуем пользователям MySQL перейти на более свежую версию MySQLdb как можно скорее. Бэкенд «mysql_old» предоставляется только для облегчения этого перехода и считается устаревшим; кроме необходимых исправлений безопасности, он не будет активно поддерживаться и будет удален в будущем выпуске Django.

Также обратите внимание, что некоторые возможности, например, новая настройка DATABASE_OPTIONS (подробнее см. databases documentation), доступны только для бэкенда «mysql» и не будут доступны для «mysql_old».

Изменены имена ограничений базы данных

Формат имен ограничений, которые Django генерирует для ссылок на внешние ключи, немного изменился. Эти имена обычно используются только в тех случаях, когда невозможно поместить ссылку непосредственно на затронутый столбец, поэтому они не всегда видны.

Эффект этого изменения заключается в том, что выполнение manage.py reset и аналогичных команд в существующей базе данных может привести к созданию SQL с новой формой имени ограничения, в то время как сама база данных содержит ограничения, названные в старой форме; это приведет к тому, что сервер базы данных выдаст сообщение об ошибке, связанной с изменением несуществующих ограничений.

Если вам необходимо обойти эту проблему, есть два метода:

  1. Перенаправьте вывод manage.py в файл и отредактируйте сгенерированный SQL, чтобы использовать правильные имена ограничений перед его выполнением.
  2. Изучите вывод manage.py sqlall, чтобы увидеть имена ограничений нового стиля, и используйте его как руководство для переименования существующих ограничений в вашей базе данных.

Изменение имени в manage.py

Несколько опций для manage.py изменились с добавлением поддержки приспособлений:

  • Появились новые команды dumpdata и loaddata, которые, как и следовало ожидать, будут сбрасывать и загружать данные в/из базы данных. Эти команды могут работать с любым из поддерживаемых Django форматов сериализации.
  • Команда sqlinitialdata была переименована в sqlcustom, чтобы подчеркнуть, что loaddata следует использовать для данных (и sqlcustom для других пользовательских SQL - представлений, хранимых процедур и т.д.).
  • Убрана устаревшая команда install. Используйте syncdb.

Изменена экранировка обратной косой черты

API базы данных Django теперь экранирует обратные слеши, передаваемые в качестве параметров запроса. Если у вас есть код API базы данных, который сопоставляет обратные слэши, и он работал раньше (несмотря на отсутствие экранирования), вам придется изменить свой код, чтобы «убрать» слэши на один уровень.

Например, раньше это работало так:

# Find text containing a single backslash
MyModel.objects.filter(text__contains='\\\\')

Вышеприведенное утверждение неверно и должно быть переписано следующим образом:

# Find text containing a single backslash
MyModel.objects.filter(text__contains='\\')

Удалена настройка ENABLE_PSYCO

Настройка ENABLE_PSYCO больше не существует. Если ваш файл настроек включает ENABLE_PSYCO, это не будет иметь никакого эффекта; чтобы использовать Psyco, мы рекомендуем написать класс промежуточного ПО для его активации.

Что нового в 0.96?

Эта ревизия представляет собой более тысячи исходных коммитов и более четырехсот исправлений ошибок, поэтому мы не можем каталогизировать все изменения. Здесь мы описываем наиболее заметные изменения в этом выпуске.

Новая библиотека форм

django.newforms - это новая библиотека Django для работы с формами. Она заменяет django.forms, старый фреймворк форм/манипулятора/оценки. Оба API доступны в 0.96, но в течение следующих двух релизов мы планируем полностью перейти на новую систему форм, а старую систему деприватизировать и удалить.

В этом переходе есть три элемента:

  • Мы скопировали текущее значение django.forms в django.oldforms. Это позволит вам обновить ваш код сейчас, а не ждать изменений, несовместимых с обратным ходом, и не спешить исправлять свой код после этого. Просто измените свои операторы импорта следующим образом:

    from django import forms             # 0.95-style
    from django import oldforms as forms # 0.96-style
    
  • В следующем официальном выпуске Django текущая версия django.newforms будет переведена на django.forms. Это будет обратно несовместимое изменение, и всем, кто все еще использует старую версию django.forms к тому времени, нужно будет изменить свои операторы импорта, как описано выше.

  • В следующем релизе после этого будет полностью удалено django.oldforms.

Хотя библиотека newforms будет продолжать развиваться, она уже готова к использованию для большинства распространенных случаев. Мы рекомендуем всем, кто только начинает работать с формами, отказаться от старой системы форм и начать с новой.

Для получения дополнительной информации о django.newforms, прочитайте newforms documentation.

Улучшения в URLconf

Теперь вы можете использовать любую вызываемую переменную в качестве обратного вызова в URLconfs (ранее разрешалось использовать только строки, ссылающиеся на вызываемые переменные). Это позволяет использовать URLconfs гораздо более естественно. Например, этот URLconf:

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    ('^myview/$', 'mysite.myapp.views.myview')
)

теперь может быть переписана как:

from django.conf.urls.defaults import *
from mysite.myapp.views import myview

urlpatterns = patterns('',
    ('^myview/$', myview)
)

Одно из полезных применений этого можно увидеть при использовании декораторов; это изменение позволяет вам применять декораторы к представлениям в вашей URLconf. Таким образом, вы можете сделать общее представление, требующее входа в систему, очень просто:

from django.conf.urls.defaults import *
from django.contrib.auth.decorators import login_required
from django.views.generic.list_detail import object_list
from mysite.myapp.models import MyModel

info = {
    "queryset" : MyModel.objects.all(),
}

urlpatterns = patterns('',
    ('^myview/$', login_required(object_list), info)
)

Обратите внимание, что оба синтаксиса (строки и callables) действительны и останутся действительными в обозримом будущем.

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

Django теперь включает фреймворк для тестирования, так что вы можете начать трансформировать страх в скуку (с извинениями Кенту Беку). Вы можете писать тесты на основе doctest или unittest и тестировать ваши представления с помощью простого тестового клиента.

Также появилась поддержка «фикстур» - начальных данных, хранящихся в любом из поддерживаемых serialization formats, которые будут загружены в вашу базу данных в начале тестирования. Это значительно упрощает тестирование с реальными данными.

Подробную информацию см. в разделе the testing documentation.

Улучшения в интерфейсе администратора

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

Спасибо

Начиная с версии 0.95, несколько человек сделали шаг вперед и взяли на себя новую важную роль в развитии Django. Мы хотели бы поблагодарить этих людей за всю их тяжелую работу:

  • Расселу Кит-Мейджи и Малкольму Трединнику за их большой вклад в код. Без них этот выпуск был бы невозможен.
  • Наш новый менеджер релизов, Джеймс Беннетт, за его работу по выпуску 0.95.1, 0.96 и (надеюсь) будущих релизов.
  • Нашим билетным менеджерам Крису Бивену (он же SmileyChris), Саймону Гринхиллу, Майклу Радзиею и Гари Уилсону. Они согласились взять на себя монументальную задачу по объединению наших тикетов в хорошо каталогизированное представление. Выяснить, над чем работать, теперь стало в миллион раз проще; еще раз спасибо, ребята.
  • Каждый, кто прислал сообщение об ошибке, патч или комментарий к билету. Мы не можем поблагодарить всех поименно - более 200 разработчиков прислали исправления, которые вошли в 0.96 - но все, кто внес свой вклад в Django, перечислены в списке AUTHORS.
Вернуться на верх