Примечания к выпуску 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 с новой формой имени ограничения, в то время как сама база данных содержит ограничения, названные в старой форме; это приведет к тому, что сервер базы данных выдаст сообщение об ошибке модификации несуществующих ограничений.
Если вам необходимо обойти эту проблему, есть два метода:
- Перенаправьте вывод
manage.pyв файл и отредактируйте сгенерированный SQL, чтобы использовать правильные имена ограничений перед его выполнением. - Изучите вывод
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='\\')
Что нового в версии 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), Саймону Гринхиллу, Майклу Радзиею и Гари Уилсону. Они согласились взять на себя монументальную задачу по объединению наших тикетов в хорошо каталогизированное представление. Выяснить, над чем работать, теперь стало в миллион раз проще; еще раз спасибо, ребята.
- Everyone who submitted a bug report, patch or ticket comment. We can’t possibly thank everyone by name – over 200 developers submitted patches that went into 0.96 – but everyone who’s contributed to Django is listed in AUTHORS.