Примечания к выпуску 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), Саймону Гринхиллу, Майклу Радзиею и Гари Уилсону. Они согласились взять на себя монументальную задачу по объединению наших тикетов в хорошо каталогизированное представление. Выяснить, над чем работать, теперь стало в миллион раз проще; еще раз спасибо, ребята.
- Каждый, кто прислал сообщение об ошибке, патч или комментарий к билету. Мы не можем поблагодарить всех поименно - более 200 разработчиков прислали исправления, которые вошли в 0.96 - но все, кто внес свой вклад в Django, перечислены в AUTHORS.