Примечания к выпуску Django 1.1¶
29 июля 2009 г.
Добро пожаловать в Джанго 1.1!
Django 1.1 включает в себя ряд отличных новых функций, множество исправлений ошибок и простой путь обновления с Django 1.0.
Обратная несовместимость изменений в версии 1.1¶
В Django действует политика Стабильности API. Это означает, что, как правило, код, который вы разрабатываете для Django 1.0, должен продолжать работать с версией 1.1 без изменений. Однако иногда мы вносим обратно несовместимые изменения, если они необходимы для устранения ошибок, и между Django 1.0 и Django 1.1 есть несколько таких (незначительных) изменений.
Перед обновлением до Django 1.1 вам следует дважды убедиться, что следующие изменения не повлияют на вас, и обновить свой код, если они повлияют.
Изменения в именах ограничений¶
В Django 1.1 изменен метод, используемый для генерации имен ограничений базы данных, чтобы имена были согласованными независимо от размера машинного слова. Это изменение обратно несовместимо для некоторых пользователей.
Если вы используете 32-битную платформу, вы не в курсе; в результате этого изменения вы не заметите никаких различий.
Однако пользователи 64-битных платформ могут столкнуться с некоторыми проблемами при использовании команды управления reset. До этого изменения 64-битные платформы генерировали 64-битный 16-символьный дайджест в имени ограничения; например:
ALTER TABLE myapp_sometable ADD CONSTRAINT object_id_refs_id_5e8f10c132091d1e FOREIGN KEY ...
После этого изменения все платформы, независимо от размера слова, будут генерировать 32-битный 8-символьный дайджест в имени ограничения; например:
ALTER TABLE myapp_sometable ADD CONSTRAINT object_id_refs_id_32091d1e FOREIGN KEY ...
В результате этого изменения вы не сможете использовать команду управления reset для любой таблицы, созданной на 64-битной машине. Это связано с тем, что новое сгенерированное имя не будет соответствовать исторически сгенерированному имени; в результате SQL, созданный командой сброса, будет недействителен.
Если вам нужно сбросить приложение, созданное с 64-битными ограничениями, вам нужно будет вручную удалить старое ограничение перед вызовом reset.
Тестовые случаи теперь выполняются в транзакции¶
Django 1.1 запускает тесты внутри транзакции, что позволяет повысить производительность тестов (подробности см. в разделе «Улучшения производительности тестов»).
Это изменение немного обратно несовместимо, если существующим тестам необходимо проверять транзакционное поведение, если они основаны на неверных предположениях о тестовой среде или если они требуют определенного порядка тестовых примеров.
В этих случаях вместо этого можно использовать TransactionTestCase. Это всего лишь быстрое исправление, позволяющее обойти ошибки тестовых примеров, выявленные новым подходом отката; в долгосрочных тестах следует переписать, чтобы исправить тестовый пример.
Удалено промежуточное программное обеспечение SetRemoteAddrFromForwardedFor.¶
Для удобства в Django 1.0 включен дополнительный промежуточный класс — django.middleware.http.SetRemoteAddrFromForwardedFor — который обновлял значение REMOTE_ADDR на основе HTTP-заголовка X-Forwarded-For, обычно устанавливаемого некоторыми конфигурациями прокси.
Было продемонстрировано, что этот механизм нельзя сделать достаточно надежным для общего использования, и что (несмотря на обратное в документации) его включение в Django может привести разработчиков приложений к предположению, что значение REMOTE_ADDR «безопасно» или каким-то образом надежно в качестве источника аутентификации.
Хотя это и не является прямой проблемой безопасности, мы решили удалить это промежуточное ПО в выпуске Django 1.1. Он был заменен классом, который не делает ничего, кроме выдачи предупреждения DeprecationWarning.
Если вы полагались на это промежуточное программное обеспечение, самый простой путь обновления:
Проверьте код в том виде, в котором он существовал до удаления.
Убедитесь, что он правильно работает с вашим вышестоящим прокси-сервером, изменив его для поддержки вашего конкретного прокси-сервера (при необходимости).
Представьте свою модифицированную версию SetRemoteAddrFromForwardedFor как часть промежуточного программного обеспечения в вашем собственном проекте.
Названия загруженных файлов будут доступны позже.¶
В Django 1.0 файлы, загруженные и сохраненные в FileField модели, сохранялись на диск до того, как модель была сохранена в базе данных. Это означало, что фактическое имя файла, присвоенное файлу, было доступно до сохранения. Например, он был доступен в обработчике сигнала предварительного сохранения модели.
В Django 1.1 файл сохраняется как часть сохранения модели в базе данных, поэтому на фактическое имя файла, используемое на диске, нельзя полагаться до тех пор, пока после модель не будет сохранена.
Изменения в способе сохранения наборов форм модели.¶
В Django 1.1 BaseModelFormSet теперь вызывает ModelForm.save().
Это обратно несовместимо, если вы изменяли self.initial в __init__ набора форм модели или если вы полагались на внутренние атрибуты _total_form_count или _initial_form_count BaseFormSet. Эти атрибуты теперь являются общедоступными методами.
Исправлено экранирующее поведение фильтра join.¶
Фильтр join больше не экранирует буквальное значение, передаваемое для соединителя.
Это обратно несовместимо для особой ситуации, когда литеральная строка содержит один из пяти специальных символов HTML. Таким образом, если вы писали {{ foo|join:"&" }}, теперь вам нужно написать {{ foo|join:"&" }}.
Предыдущее поведение было ошибкой и противоречило тому, что было задокументировано и ожидаемо.
Постоянные перенаправления и общее представление redirect_to()¶
Django 1.1 добавляет аргумент «постоянный» в представление «django.views.generic.simple.redirect_to()». Это технически обратно несовместимо, если вы использовали представление redirect_to с ключом форматной строки, называемым „permanent“, что крайне маловероятно.
Функции, устаревшие в версии 1.1¶
Одна функция была помечена как устаревшая в Django 1.1:
Вам больше не следует использовать AdminSite.root() для регистрации представлений администратора. То есть, если ваш URLconf содержит строку:
(r"^admin/(.*)", admin.site.root),
Вы должны изменить его на следующий:
(r"^admin/", include(admin.site.urls)),
Вам следует немедленно начать удалять использование этой функции из вашего кода.
AdminSite.root выдаст PendingDeprecationWarning, если он используется в Django 1.1. По умолчанию это предупреждение скрыто. В Django 1.2 это предупреждение будет заменено на «DeprecationWarning», которое будет отображаться громко. Django 1.3 полностью удалит AdminSite.root().
Более подробную информацию о нашей политике и стратегии прекращения поддержки см. в документе Процесс выпуска Django.
Что нового в Джанго 1.1¶
Совсем немного: начиная с Django 1.0 мы сделали 1290 коммитов кода, исправили 1206 ошибок и добавили примерно 10 000 строк документации.
Основные новые функции Django 1.1:
Улучшения ORM¶
В объектно-реляционный картограф (ORM) Django были добавлены два основных улучшения: поддержка агрегатов и выражения запросов.
Совокупная поддержка¶
Теперь можно запускать агрегатные запросы SQL (т. е. COUNT(), MAX(), MIN() и т. д.) из ORM Django. Вы можете либо вернуть результаты агрегата напрямую, либо аннотировать объекты в QuerySet с результатами агрегатного запроса.
Эта функция доступна как новые методы aggregate() и annotate() и подробно описана в документации по агрегации ORM.
Выражения запроса¶
Запросы теперь могут ссылаться на другое поле запроса и могут пересекать отношения, ссылаясь на поля в связанных моделях. Это реализовано в новом объекте F; для получения полной информации, включая примеры, обратитесь к документации по выражениям F.
Улучшения модели¶
В слой модели Django был добавлен ряд функций:
«Неуправляемые» модели¶
Теперь вы можете контролировать, управляет ли Django жизненным циклом таблиц базы данных для модели, используя параметр модели managed. По умолчанию установлено значение «True», что означает, что Django создаст соответствующие таблицы базы данных в «syncdb» и удалит их как часть команды «reset». То есть Django управляет жизненным циклом таблицы базы данных.
Однако если вы установите для этого параметра значение «False», для этой модели автоматическое создание или удаление таблиц базы данных выполняться не будет. Это полезно, если модель представляет собой существующую таблицу или представление базы данных, созданное каким-либо другим способом.
Более подробную информацию см. в документации по параметру managed.
Прокси-модели¶
Теперь вы можете создавать прокси-модели: подклассы существующих моделей, которые добавляют только поведение уровня Python (а не уровня базы данных) и не представлены новой таблицей. То есть новая модель является прокси для некоторой базовой модели, в которой хранятся все реальные данные.
Все подробности можно найти в документации по прокси-моделям <proxy-models>`. Эта функция внешне похожа на неуправляемые модели, поэтому в документации есть объяснение чем прокси-модели отличаются от неуправляемых моделей.
Отложенные поля¶
В некоторых сложных ситуациях ваши модели могут содержать поля, которые могут содержать много данных (например, большие текстовые поля) или требовать дорогостоящей обработки для их преобразования в объекты Python. Если вы знаете, что эти конкретные поля вам не нужны, теперь вы можете указать Django не извлекать их из базы данных.
Вы сделаете это с помощью новых методов набора запросов defer() и only().
Улучшения тестирования¶
В инфраструктуру тестирования было внесено несколько заметных улучшений.
Улучшение производительности тестов¶
Тесты, написанные с использованием среды тестирования Django, теперь выполняются значительно быстрее (во многих случаях в 10 раз быстрее).
Это было достигнуто за счет введения тестов на основе транзакций: при использовании django.test.TestCase ваши тесты теперь будут запускаться в транзакции, которая откатывается после завершения, а не путем очистки и повторного заполнения базы данных. Это приводит к огромному ускорению большинства типов модульных тестов. См. документацию по TestCase и TransactionTestCase для получения полного описания и некоторых важных замечаний по поддержке баз данных.
Тестирование улучшений клиента¶
В тестовый клиент было внесено несколько небольших, но очень полезных улучшений:
Тестовый
Clientтеперь может автоматически следовать за перенаправлениями с аргументомfollowнаClient.get()иClient.post(). Это упрощает тестирование представлений, которые выдают перенаправления.Теперь стало проще получить контекст шаблона в ответе, возвращаемом тестовым клиентом: вы просто получите доступ к контексту как
request.context[key]. Старый способ, при которомrequest.contextрассматривается как список контекстов, по одному для каждого отображаемого шаблона в цепочке наследования, по-прежнему доступен, если он вам нужен.
Новые возможности администратора¶
Django 1.1 добавляет пару отличных новых функций в интерфейс администратора Django:
Редактируемые поля в списке изменений¶
Теперь вы можете сделать поля редактируемыми в представлениях списка администраторов с помощью новой опции администратора list_editable. Эти поля будут отображаться как виджеты форм на страницах списка, и их можно будет массово редактировать и сохранять.
«Действия» администратора¶
Теперь вы можете определить действия администратора, которые могут выполнять массовое действие над группой моделей. Пользователи смогут выбирать объекты на странице списка изменений, а затем применять эти массовые действия ко всем выбранным объектам.
Django поставляется с одним предопределенным действием администратора для удаления группы объектов одним махом.
Обработка условного представления¶
Django теперь имеет гораздо лучшую поддержку обработки условного представления с использованием стандартных HTTP-заголовков ETag и Last-Modified. Это означает, что теперь вы можете легко сократить обработку представлений, проверив менее затратные условия. Для многих просмотров это может привести к серьезному улучшению скорости и снижению пропускной способности.
Пространства имен URL-адресов¶
В Django 1.1 улучшены шаблоны именованных URL-адресов <naming-url-patterns>` за счет введения «пространств имен» URL-адресов.
Короче говоря, эта функция позволяет несколько раз включать одну и ту же группу URL-адресов из одного и того же приложения в URLConf Django с разными (и потенциально вложенными) именованными префиксами, которые будут использоваться при выполнении обратного разрешения. Другими словами, многократно используемые приложения, такие как интерфейс администратора Django, могут быть зарегистрированы несколько раз без конфликтов URL-адресов.
Более подробную информацию можно найти в документации по определению пространств имен URL.
ГеоДжанго¶
В Django 1.1 GeoDjango (т. е. django.contrib.gis) имеет несколько новых функций:
Поддержка SpatiaLite — пространственной базы данных для SQLite — в качестве пространственного бэкэнда.
Географические агрегаты (
Collect,Extent,MakeLine,Union) и выраженияF.Новые методы GeoQuerySet: Collect, geojson и snap_to_grid.
Новый список методов интерфейса для объектов
GEOSGeometry.
Более подробную информацию см. в документации GeoDjango.
Другие улучшения¶
Другие новые функции и изменения, представленные после Django 1.0, включают:
Промежуточное ПО защиты CSRF </ref/csrf>` разделено на два класса:
CsrfViewMiddlewareпроверяет входящие запросы, аCsrfResponseMiddlewareобрабатывает исходящие ответы. Комбинированный класс CsrfMiddleware (который выполняет и то, и другое) остается для обратной совместимости, но теперь рекомендуется использовать разделенные классы, чтобы обеспечить детальный контроль над тем, когда и где происходит обработка CSRF.reverse()и код, который его использует (например, тег шаблона{% url %}) теперь работает с URL-адресами на административном сайте Django, при условии, что URL-адреса администратора настроены черезinclude(admin.site.urls)(отправка запросов администратора в представлениеadmin.site.rootпо-прежнему работает, но URL-адреса в администраторе не будут «обратимыми» при такой настройке).Функция
include()в модулях URLconf Django теперь может принимать последовательности шаблонов URL (сгенерированныеpatterns()) в дополнение к именам модулей.Экземпляры форм Django (см. обзор форм) теперь имеют два дополнительных метода:
hidden_fields()иvisible_fields(), которые возвращают список скрытых, т. е.<input type="hidden">, и видимых полей формы соответственно.Общее представление
redirect_toтеперь принимает дополнительный аргумент ключевого словаpermanent. Если параметр «permanent» имеет значение «True», представление будет генерировать постоянное перенаправление HTTP (код состояния 301). Если установлено значение «False», представление выполнит временное перенаправление HTTP (код состояния 302).Новый тип поиска в базе данных — «week_day» — был добавлен для DateField и DateTimeField. Этот тип поиска принимает число от 1 (воскресенье) до 7 (суббота) и возвращает объекты, в которых значение поля соответствует этому дню недели. Подробности смотрите в полном списке типов поиска <field-lookups>.
Тег
{% for %}в языке шаблонов Django теперь принимает необязательное предложение{% пустой %}, которое будет отображаться, когда{% for %}запрашивается для перебора пустой последовательности. Примеры этого см. в списке встроенных тегов шаблонов.Команда управления
dumpdataтеперь принимает имена отдельных моделей в качестве аргументов, что позволяет экспортировать данные только из определенных моделей.Появился новый шаблонный фильтр
safeseq, который работает так же, какsafeдля списков, помечая каждый элемент в списке как безопасный.Бэкэнды кэширования теперь поддерживают команды
incr()иdecr()для увеличения и уменьшения значения ключа кэша. На серверах кэширования, поддерживающих атомарное увеличение/уменьшение (в первую очередь на memcached), эти операции будут атомарными и довольно быстрыми.Django теперь может легко делегировать аутентификацию веб-серверу через новый механизм аутентификации, который поддерживает стандартную переменную среды
REMOTE_USER, используемую для этой цели.Появилась новая функция django.shortcuts.redirect, которая упрощает выполнение перенаправлений по объекту, имени представления или URL-адресу.
Серверная часть
postgresql_psycopg2теперь поддерживает родную автофиксацию PostgreSQL. Это расширенная функция, специфичная для PostgreSQL, которая может значительно ускорить работу некоторых приложений с большим объемом чтения.
Что дальше?¶
Мы сделаем небольшой перерыв, а затем начнем работу над Django 1.2 — усталым нет покоя! Если вы хотите помочь, обсуждение разработки Django, включая ход подготовки к выпуску 1.2, происходит ежедневно на сайте django-developers в списке рассылки и на IRC-канале #django-dev на irc.libera.chat. Смело присоединяйтесь к обсуждениям!
Онлайн-документация Django также содержит указания о том, как внести свой вклад в Django:
Вклад на любом уровне — разработка кода, написание документации или просто проверка заявок и помощь в тестировании предлагаемых исправлений — всегда приветствуются и ценятся.
И это так.