Примечания к выпуску Django 1.2¶
17 мая 2010 г.
Добро пожаловать в Джанго 1.2!
Django 1.2 создавался почти год и содержит впечатляющий список новых функций и множество исправлений ошибок. В этих примечаниях к выпуску описаны новые функции, а также важные изменения, о которых вам следует знать при обновлении с Django 1.1 или более ранних версий.
Обзор¶
В Django 1.2 представлено несколько крупных и важных новых функций, в том числе:
Поддержка множественных подключений к базам данных в одном экземпляре Django.
Проверка модели вдохновлена проверкой формы в Django.
Значительно улучшена защита от подделки межсайтовых запросов <improved-csrf-protection> (CSRF).
Новая инфраструктура пользовательских «сообщений» с поддержкой сообщений на основе файлов cookie и сеансов как для анонимных, так и для аутентифицированных пользователей.
Хуки для разрешений на уровне объекта, разрешений для анонимных пользователей и более гибких требований к имени пользователя.
Настройка отправки электронной почты через email backends.
Новый тег шаблона «smart» if, который поддерживает операторы сравнения.
Это лишь основные моменты; Полную информацию и полный список функций можно найти ниже.
См.также
Django Advent освещал выпуск Django 1.2 серией статей и руководств, подробно освещающих некоторые новые функции.
Везде, где это возможно, эти функции были реализованы с обратной совместимостью в соответствии с нашей политикой стабильности API.
Однако некоторые функции изменились таким образом, что для некоторых пользователей они будут обратно несовместимы. Большие изменения заключаются в следующем:
Поддержка Python 2.3 прекращена. Полные примечания см. ниже.
Новая структура защиты CSRF не имеет обратной совместимости со старой системой. Пользователи старой системы не будут затронуты до тех пор, пока старая система не будет удалена в Django 1.4.
Однако обновление до новой структуры защиты CSRF требует нескольких важных изменений, несовместимых с предыдущими версиями, подробно описанных в разделе «Защита CSRF» ниже.
Авторы пользовательских подклассов
Fieldдолжны знать, что у ряда методов были изменены прототипы, подробно описанные в разделе get_db_prep_*() в Field ниже.Внутреннее устройство тегов шаблонов несколько изменилось; авторы пользовательских тегов шаблонов, которым необходимо хранить состояние (например, пользовательских тегов потока управления), должны убедиться, что их код соответствует новым правилам для тегов шаблонов с отслеживанием состояния
user_passes_test(),login_required()иpermission_required(), декораторы изdjango.contrib.authприменяются только к функциям и не дольше работать над методами. Существует простое исправление в одну строку, подробно описанное ниже <user-passes-test-login-required-permission-required>.
Опять же, это лишь основные функции, которые повлияют на большинство пользователей. Пользователям, обновляющим предыдущие версии Django, настоятельно рекомендуется ознакомиться с полным списком обратно-несовместимых изменений и списком устаревших функций.
Совместимость версий Python¶
Хотя это и не новая функция, важно отметить, что Django 1.2 вносит первый сдвиг в нашу политику совместимости Python с момента первоначального публичного дебюта Django. Предыдущие выпуски Django тестировались и поддерживались на версиях Python 2.x, начиная с 2.3; Однако в Django 1.2 официальная поддержка Python 2.3 прекращена. Таким образом, минимальная версия Python, необходимая для Django, теперь составляет 2.4, а Django тестируется и поддерживается на Python 2.4, 2.5 и 2.6 и будет поддерживаться на еще не выпущенном Python 2.7.
Это изменение должно затронуть лишь небольшое количество пользователей Django, поскольку сегодня большинство поставщиков операционных систем поставляют Python 2.4 или новее в качестве версии по умолчанию. Однако если вы все еще используете Python 2.3, вам придется придерживаться Django 1.1 до тех пор, пока вы не сможете обновиться; Согласно нашей политике поддержки, Django 1.1 будет продолжать получать поддержку безопасности до выпуска Django 1.3.
Дорожная карта по общей поддержке Python версии 2.x в Django и возможному переходу на Python 3.x в настоящее время разрабатывается и будет объявлена до выпуска Django 1.3.
Что нового в Джанго 1.2¶
Поддержка нескольких баз данных¶
В Django 1.2 добавлена возможность использовать более одной базы данных в вашем проекте Django. Запросы могут быть выполнены в конкретной базе данных с помощью метода using() для объектов QuerySet. Отдельные объекты можно сохранить в определенной базе данных, указав аргумент using при вызове save().
Проверка модели¶
Экземпляры моделей теперь поддерживают проверку собственных данных, а поля модели и формы теперь принимают настраиваемые списки валидаторов, определяющие многократно используемое, инкапсулированное поведение проверки. Однако обратите внимание, что проверка все равно должна выполняться явно. Простой вызов метода save() экземпляра модели не приведет к какой-либо проверке данных экземпляра.
Улучшенная защита CSRF¶
Django теперь имеет значительно улучшенную защиту от атак Межсайтовая подделка запросов (CSRF). Этот тип атаки происходит, когда вредоносный веб-сайт содержит ссылку, кнопку формы или какой-либо код JavaScript, предназначенный для выполнения определенного действия на вашем веб-сайте с использованием учетных данных вошедшего в систему пользователя, который посещает вредоносный сайт в своем браузере. Также рассматривается родственный тип атаки «login CSRF», когда атакующий сайт обманом заставляет браузер пользователя войти на сайт с чужим учетными данными.
Структура сообщений¶
Django теперь включает в себя надежную и настраиваемую инфраструктуру сообщений со встроенной поддержкой обмена сообщениями на основе файлов cookie и сеансов как для анонимных, так и для аутентифицированных клиентов. Платформа сообщений заменяет устаревший API сообщений пользователя и позволяет временно хранить сообщения в одном запросе и извлекать их для отображения в последующем запросе (обычно следующем).
Разрешения на уровне объекта¶
Добавлена основа для указания разрешений на уровне каждого объекта. Хотя в ядре это не реализовано, пользовательский сервер аутентификации может обеспечить такую реализацию, и она будет использоваться django.contrib.auth.models.User. Дополнительную информацию см. в документах по аутентификации.
Разрешения для анонимных пользователей¶
Если вы предоставляете собственный бэкэнд аутентификации с параметром Supports_anonymous_user, установленным в значение True, AnonymousUser проверит бэкэнд на наличие разрешений, как это уже сделал Пользователь. Это полезно для централизации обработки разрешений — приложения всегда могут делегировать вопрос о том, разрешено или нет что-то, серверной части авторизации/аутентификации. Дополнительную информацию см. в документах по аутентификации.
Смягченные требования к именам пользователей¶
Встроенное поле User модели username теперь допускает более широкий диапазон символов, включая символы @, +, . и -.
Серверная часть электронной почты¶
Теперь вы можете настроить способ отправки Django электронной почты. Вместо использования SMTP для отправки всей электронной почты теперь вы можете выбрать настраиваемый сервер электронной почты для отправки сообщений. Если ваш хостинг-провайдер использует песочницу или какой-либо другой метод, не связанный с SMTP, для отправки почты, теперь вы можете создать серверную часть электронной почты, которая позволит стандартным методам отправки почты Django использовать эти возможности.
Это также упрощает отладку отправки почты. Django поставляется с реализациями серверной части, которые позволяют отправлять электронную почту в file, в console или в memory. Вы даже можете настроить так, чтобы вся электронная почта была выброшена.
«Умный» тег if¶
Тег if был обновлен и стал гораздо более мощным. Во-первых, мы добавили поддержку операторов сравнения. Вам больше не придется вводить:
{% ifnotequal a b %}
...
{% endifnotequal %}
Теперь вы можете сделать это:
{% if a != b %}
...
{% endif %}
На самом деле нет причин больше использовать {% ifequal %} или {% ifnotequal %}, если только вы не относитесь к ностальгическому типу.
Поддерживаются операторы ==, !=, <, >, <=, >=, in и not in, все они работают как операторы Python, в дополнение к and, or и not, которые уже поддерживались.
Кроме того, фильтры теперь можно использовать в выражении if. Например:
<div
{% if user.email|lower == message.recipient|lower %}
class="highlight"
{% endif %}
>{{ message }}</div>
Кэширование шаблонов¶
В предыдущих версиях Django каждый раз, когда вы отображали шаблон, он перезагружался с диска. В Django 1.2 вы можете использовать кэшированный загрузчик шаблонов <template-loaders>` для однократной загрузки шаблонов, а затем кэшировать результат для каждого последующего рендеринга. Это может привести к значительному повышению производительности, если ваши шаблоны разбиты на множество подшаблонов меньшего размера (с использованием тегов {% расширяет %} или {% include %}.
В качестве побочного эффекта теперь стало намного проще поддерживать языки шаблонов, отличные от Django.
Загрузчики шаблонов на основе классов¶
В рамках изменений, внесенных для внедрения Кэширования шаблонов и следуя общей тенденции в Django, API загрузчиков шаблонов был изменен для использования механизмов загрузки шаблонов, которые инкапсулированы в классы Python, а не в функции, единственный метод, доступный до Django 1.1.
Все загрузчики шаблонов, поставляемые с Django <template-loaders>, были портированы на новый API, но они по-прежнему реализуют API, основанный на функциях, а механизм ядра шаблонов по-прежнему принимает загрузчики, основанные на функциях (встроенные или сторонние), поэтому нет немедленной необходимости изменять настройку TEMPLATE_LOADERS в существующих проектах, все будет работать, если вы оставите его нетронутым вплоть до выпуска Django 1.3 включительно.
Если вы разработали свои собственные загрузчики шаблонов, мы предлагаем рассмотреть возможность их переноса на реализацию на основе классов, поскольку код для обратной совместимости с загрузчиками на основе функций начинает процесс устаревания в Django 1.2 и будет удален в Django 1.4. В справочнике по API шаблонов есть описание API, который эти классы загрузчиков должны реализовать, а также вы можете изучить исходный код загрузчиков, поставляемых с Django.
Натуральные ключи в светильниках¶
Фикстуры теперь могут ссылаться на удаленные объекты, используя Естественные ключи. Эта схема поиска является альтернативой обычным ссылкам на объекты на основе первичного ключа в приспособлении, улучшая читаемость и решая проблемы, связанные с объектами, значение первичного ключа которых может быть непредсказуемым или известным.
Быстрый провал тестов¶
И подкоманда test в django-admin.py, и скрипт runtests.py, используемый для запуска собственного набора тестов Django, теперь поддерживают опцию --failfast. Если этот параметр указан, этот параметр приводит к завершению выполнения теста после обнаружения сбоя вместо продолжения выполнения теста. Кроме того, обработка сочетания клавиш Ctrl-C во время запуска теста была улучшена, чтобы вызвать корректный выход из запуска теста, который сообщает подробную информацию о тестах, которые были запущены до прерывания.
БигИнтегерФилд¶
Модели теперь могут использовать 64-битный тип BigIntegerField.
Улучшенная локализация¶
Среда интернационализации Django была расширена за счет форматирования и обработки форм с учетом локали. Это означает, что если этот параметр включен, даты и числа в шаблонах будут отображаться в формате, указанном для текущей локали. Django также будет использовать локализованные форматы при анализе данных в формах. Дополнительную информацию см. в Формат локализации.
readonly_fields в ModelAdmin¶
django.contrib.admin.ModelAdmin.readonly_fields был добавлен для включения нередактируемых полей на страницах добавления/изменения для моделей и встроенных строк. Поля и рассчитанные значения могут отображаться рядом с редактируемыми полями.
Настраиваемая подсветка синтаксиса¶
Теперь вы можете использовать переменную среды DJANGO_COLORS для изменения или отключения цветов, используемых django-admin.py для обеспечения подсветки синтаксиса.
ГеоДжанго¶
Наиболее важной новой функцией GeoDjango в версии 1.2 является поддержка нескольких пространственных баз данных. В результате теперь включены следующие бэкенды пространственных баз данных:
django.contrib.gis.db.backends.postgisdjango.contrib.gis.db.backends.mysqldjango.contrib.gis.db.backends.oracledjango.contrib.gis.db.backends.spatialite
GeoDjango теперь поддерживает богатые возможности, добавленные в версию PostGIS 1.5. Новые функции включают поддержку типа географии и включение запросов расстояния с неточечной геометрией в географических системах координат.
Была добавлена поддержка полей трехмерной геометрии, и ее можно включить, установив для ключевого слова dim значение 3 в вашем GeometryField. Как часть этой функции были добавлены агрегат Extent3D и метод extent3d() GeoQuerySet.
Методы force_rhr(), reverse_geom() и geohash(), GeoQuerySet являются новыми.
Интерфейс GEOS был обновлен для использования функций потокобезопасной библиотеки C, если они доступны на платформе.
Интерфейс GDAL теперь позволяет пользователю устанавливать spatial_filter для объектов, возвращаемых при итерации Layer.
Наконец, Документация GeoDjango теперь включена в состав Django и больше не размещается отдельно на geodjango.org.
Новые символы спецификатора формата тега шаблона now: c и u¶
Аргумент now получил два новых символа формата: c, чтобы указать, что значение даты и времени должно быть отформатировано в формате ISO 8601, и u, который позволяет выводить микросекундную часть значения даты и времени или времени.
Они также доступны в других частях, таких как фильтры шаблонов date и time, библиотека тегов шаблонов humanize и новая структура ``format localization`_.
Обратная несовместимость изменений в версии 1.2¶
Везде, где это возможно, новые функции, описанные выше, были введены с обратной совместимостью в соответствии с нашей политикой стабильности API. Это означает, что практически весь существующий код, работавший с Django 1.1, продолжит работать и с Django 1.2; однако такой код начнет выдавать предупреждения (подробности см. ниже).
Однако некоторые функции изменились таким образом, что для некоторых пользователей они сразу станут обратно несовместимыми. Эти изменения подробно описаны ниже.
CSRF-защита¶
Мы внесли большие изменения в способ работы защиты CSRF, подробно описанный в документации CSRF. Вот основные изменения, о которых вам следует знать:
CsrfResponseMiddlewareиCsrfMiddlewareустарели и будут полностью удалены в Django 1.4 в пользу тега шаблона, который следует вставлять в формы.Все приложения-участники используют декоратор csrf_protect для защиты представления. Для этого необходимо использовать в шаблоне тег шаблона
csrf_token. Если вы использовали пользовательские шаблоны для дополнительных представлений, НЕОБХОДИМО ПРОЧИТАТЬ ИНСТРУКЦИИ ПО ОБНОВЛЕНИЮ, чтобы исправить эти шаблоны.Документация удалена
Примечания по обновлению были удалены из текущей документации Django. Пожалуйста, обратитесь к документации для Django 1.3 или более ранней версии, чтобы найти эти инструкции.
CsrfViewMiddleware включен в MIDDLEWARE_CLASSES по умолчанию. Это по умолчанию включает защиту CSRF, поэтому представления, принимающие запросы POST, необходимо писать для работы с промежуточным программным обеспечением. Инструкции о том, как это сделать, можно найти в документации CSRF.
Весь CSRF перенесен из вклада в ядро (с обратно совместимым импортом в старые местоположения, которые устарели и перестанут поддерживаться в Django 1.4).
get_db_prep_*() методы для Field¶
До Django 1.2 в пользовательском «Поле» можно было определить несколько функций для поддержки преобразования значений Python в значения, совместимые с базой данных. Пользовательское поле может выглядеть примерно так:
class CustomModelField(models.Field):
...
def db_type(self): ...
def get_db_prep_save(self, value): ...
def get_db_prep_value(self, value): ...
def get_db_prep_lookup(self, lookup_type, value): ...
В версии 1.2 эти три метода претерпели изменения в прототипе и были введены два дополнительных метода:
class CustomModelField(models.Field):
...
def db_type(self, connection): ...
def get_prep_value(self, value): ...
def get_prep_lookup(self, lookup_type, value): ...
def get_db_prep_save(self, value, connection): ...
def get_db_prep_value(self, value, connection, prepared=False): ...
def get_db_prep_lookup(self, lookup_type, value, connection, prepared=False): ...
Эти изменения необходимы для поддержки нескольких баз данных — db_type и get_db_prep_* больше не могут делать никаких предположений относительно базы данных, для которой они готовятся. Аргумент connection теперь предоставляет методам подготовки конкретное соединение, для которого подготавливается значение.
Существуют два новых метода, позволяющие отличить общие требования к подготовке данных от требований, специфичных для базы данных. Аргумент prepared используется для указания методам подготовки базы данных, была ли выполнена подготовка общего значения. Если для вызовов get_db_prep_*() предоставляется неподготовленное значение (т. е. «prepared=False»), они должны вызвать соответствующие вызовы get_prep_*() для выполнения общей подготовки данных.
Мы предоставили функции преобразования, которые прозрачно преобразуют функции, соответствующие старому прототипу, в функции, совместимые с новым прототипом. Однако эти функции преобразования будут удалены в Django 1.4, поэтому вам следует как можно скорее обновить определения «Поля», чтобы использовать новый прототип.
Если ваши методы get_db_prep_*() не используют соединение с базой данных, вы сможете выполнить обновление, переименовав get_db_prep_value() в get_prep_value() и get_db_prep_lookup() в get_prep_lookup(). Если вам требуются преобразования, специфичные для базы данных, вам необходимо предоставить реализацию get_db_prep_*, которая использует аргумент Connection для разрешения значений, специфичных для базы данных.
user_passes_test, login_required и permission_required¶
django.contrib.auth.decorators предоставляет декораторы login_required, permission_required и user_passes_test. Раньше эти декораторы можно было использовать как в функциях (где первый аргумент — «запрос»), так и в методах (где первый аргумент — «я», а второй аргумент — «запрос»). К сожалению, в коде, поддерживающем это, были обнаружены недостатки: он работает только в ограниченных случаях и выдаёт ошибки, которые очень сложно отладить, когда он не работает.
По этой причине поведение «автоматической адаптации» было удалено, и если вы используете эти декораторы для методов, вам нужно будет вручную применить django.utils.decorators.method_decorator(), чтобы преобразовать декоратор в тот, который работает с методами. Например, вы можете изменить код следующим образом:
class MyClass(object):
@login_required
def my_view(self, request):
pass
на это:
from django.utils.decorators import method_decorator
class MyClass(object):
@method_decorator(login_required)
def my_view(self, request):
pass
или:
from django.utils.decorators import method_decorator
login_required_m = method_decorator(login_required)
class MyClass(object):
@login_required_m
def my_view(self, request):
pass
Для тех из вас, кто следил за развитием разработки, это изменение также относится к другим декораторам, представленным начиная с версии 1.1, включая csrf_protect,cache_control и все, что создано с использованиемdecorator_from_middleware.
if меняется тег¶
Благодаря новым функциям тега шаблона if он больше не принимает «и», «или» и «не» в качестве допустимых имен переменных. Раньше эти строки можно было использовать в качестве имен переменных. Теперь статус ключевого слова всегда применяется, и код шаблона, такой как {% if not %} или {% if and %}, будет выдавать TemplateSyntaxError. Кроме того, in — это новое ключевое слово, поэтому оно не является допустимым именем переменной в этом теге.
ЛенивыйОбъект¶
LazyObject — это недокументированный, но часто используемый служебный класс, используемый для ленивой упаковки других объектов неизвестного типа.
В Django 1.1 и более ранних версиях интроспекция выполнялась нестандартным способом, в зависимости от обернутых объектов, реализующих общедоступный метод с именем get_all_members(). Поскольку это может легко привести к конфликтам имен, он был изменен на использование стандартного метода самоанализа Python, включающего __members__ и __dir__().
Если вы использовали LazyObject в своем коде и реализовали метод get_all_members() для обернутых объектов, вам необходимо внести пару изменений:
Во-первых, если у вашего класса нет особых требований к самоанализу (т. е. вы не реализовали __getattr__() или другие методы, позволяющие использовать атрибуты, не обнаруживаемые обычными механизмами), вы можете просто удалить метод get_all_members(). Реализация по умолчанию в LazyObject будет работать правильно.
Если у вас более сложные требования к самоанализу, сначала переименуйте метод get_all_members() в __dir__(). Это стандартный метод самоанализа для Python 2.6 и выше. Если вам требуется поддержка версий Python ниже 2.6, добавьте в класс следующий код:
__members__ = property(lambda self: self.__dir__())
__dict__ для экземпляров модели¶
Исторически атрибут __dict__ экземпляра модели содержал только атрибуты, соответствующие полям модели.
Для поддержки нескольких конфигураций базы данных в Django 1.2 добавлен атрибут _state к экземплярам объектов. Этот атрибут появится в __dict__ для экземпляра модели. Если ваш код использует итерацию __dict__ для получения списка полей, теперь вы должны быть готовы обрабатывать или фильтровать атрибут _state.
Код состояния завершения выполнения теста¶
Код состояния завершения средств запуска тестов (tests/runtests.py и Python Manage.py Test) больше не отображает количество неудачных тестов, поскольку сбой 256 или более тестов привел к неправильному коду состояния завершения. Код состояния завершения для средства запуска тестов теперь равен 0 в случае успеха (нет неудачных тестов) и 1 в случае любого количества неудачных тестов. При необходимости количество неудачных тестов можно найти в конце выходных данных средства запуска тестов.
ModelForm.is_valid() и ModelForm.errors¶
Большая часть работы по проверке ModelForms была перенесена на уровень модели. В результате, когда вы в первый раз вызываете ModelForm.is_valid(), получаете доступ к ModelForm.errors или иным образом запускаете проверку формы, ваша модель будет очищена на месте. Раньше это преобразование происходило при сохранении модели. Если вам нужен немодифицированный экземпляр вашей модели, вам следует передать копию конструктору ModelForm.
BooleanField в MySQL¶
В предыдущих версиях Django BooleanField модели в MySQL возвращал свое значение как «1» или «0» вместо «True» или «False»; для большинства людей это не было проблемой, поскольку bool является подклассом int в Python. Однако в Django 1.2 BooleanField в MySQL корректно возвращает настоящее bool. Единственный случай, когда это может стать проблемой, — это если вы ожидаете, что при повторении BooleanField будет напечатано «1» или «0».
Изменения в интерпретации max_num в FormSets.¶
В рамках усовершенствований, внесенных в обработку наборов форм, значение по умолчанию и интерпретация параметра max_num для функций django.forms.formsets.formset_factory() и django.forms.models.modelformset_factory() немного изменились. Это изменение также влияет на способ использования аргумента max_num для встроенных объектов администратора.
Раньше значением по умолчанию для max_num было 0 (ноль). Затем FormSets использовал логическое значение max_num, чтобы определить, нужно ли налагать ограничение на количество сгенерированных форм. Значение по умолчанию «0» означало, что не было ограничения по умолчанию на количество форм в FormSet.
Начиная с версии 1.2, значение по умолчанию для max_num было изменено на None, и FormSets будет различать значение None и значение 0. Значение «Нет» указывает, что ограничения на количество форм не налагаются; значение 0 указывает, что должно быть введено максимум 0 форм. Это не обязательно означает, что никакие формы не будут отображаться — более подробную информацию см. в документации ModelFormSet <model-formsets-max-num>`.
Если вы вручную указали значение 0 для max_num, вам потребуется обновить ваш FormSet и/или определения администратора.
email_re¶
Недокументированное регулярное выражение для проверки адресов электронной почты было перенесено из django.form.fields в django.core.validators. Вам нужно будет обновить импорт, если вы его используете.
Функции, устаревшие в версии 1.2¶
Наконец, в Django 1.2 исключены некоторые функции предыдущих выпусков. Эти функции по-прежнему поддерживаются, но в течение следующих нескольких циклов выпуска они будут постепенно прекращаться.
Код, использующий любую из приведенных ниже функций, вызовет предупреждение PendingDeprecationWarning в Django 1.2. По умолчанию это предупреждение будет беззвучным, но его можно включить с помощью модуля Python warnings или запустив Python с флагом -Wd или -Wall.
В Django 1.3 эти предупреждения станут DeprecationWarning, что не бесшумно. В Django 1.4 поддержка этих функций будет полностью удалена.
См.также
Для получения более подробной информации см. документацию Процесс выпуска Django и нашу графику прекращения поддержки.`
Указание баз данных¶
До Django 1.2 Django использовал ряд настроек для управления доступом к одной базе данных. В Django 1.2 появилась поддержка нескольких баз данных, и в результате изменился способ определения настроек базы данных.
Любой существующий файл настроек Django будет продолжать работать должным образом до версии Django 1.4. До тех пор настройки базы данных старого стиля будут автоматически переведены в формат нового стиля.
В старом формате (до версии 1.2) в файле настроек было несколько настроек DATABASE_. Например:
DATABASE_NAME = "test_db"
DATABASE_ENGINE = "postgresql_psycopg2"
DATABASE_USER = "myusername"
DATABASE_PASSWORD = "s3krit"
Эти настройки теперь находятся в словаре с именем DATABASES. Каждый элемент словаря соответствует одному соединению с базой данных с именем «default», описывающим соединение с базой данных по умолчанию. Названия настроек также были сокращены. Предыдущий пример настроек теперь будет выглядеть так:
DATABASES = {
"default": {
"NAME": "test_db",
"ENGINE": "django.db.backends.postgresql_psycopg2",
"USER": "myusername",
"PASSWORD": "s3krit",
}
}
Это влияет на следующие настройки:
Старая настройка |
Новая настройка |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Эти изменения также необходимы, если вы вручную создали соединение с базой данных с помощью DatabaseWrapper() из выбранной вами базы данных.
Помимо изменения структуры, в Django 1.2 удалена специальная обработка встроенных баз данных. Все серверные части базы данных теперь должны указываться полным именем модуля (т. е. django.db.backends.postgresql_psycopg2, а не просто postgresql_psycopg2).
Серверная часть базы данных postgresql¶
Библиотека psycopg1 не обновлялась с октября 2005 года. В результате серверная часть базы данных postgresql, использующая эту библиотеку, устарела.
Если вы в настоящее время используете серверную часть postgresql, вам следует перейти на использование серверной части postgresql_psycopg2. Чтобы обновить код, установите библиотеку psycopg2 и измените настройку ENGINE на использование django.db.backends.postgresql_psycopg2.
Промежуточное ПО для перезаписи ответов CSRF¶
CsrfResponseMiddleware, промежуточное программное обеспечение, которое автоматически вставляло токены CSRF в формы POST на исходящих страницах, было устарело в пользу метода тегов шаблона (см. выше) и будет полностью удалено в Django 1.4. CsrfMiddleware, включающий в себя функциональность CsrfResponseMiddleware и CsrfViewMiddleware, также устарел.
Кроме того, модуль CSRF перенесен из вклада в ядро, а старый импорт устарел, как описано в примечаниях к обновлению.
Документация удалена
Примечания по обновлению были удалены из текущей документации Django. Пожалуйста, обратитесь к документации для Django 1.3 или более ранней версии, чтобы найти эти инструкции.
SMTPConnection¶
Класс SMTPConnection устарел в пользу общего API-интерфейса электронной почты. Старый код, который явно создавал экземпляр SMTPConnection:
from django.core.mail import SMTPConnection
connection = SMTPConnection()
messages = get_notification_email()
connection.send_messages(messages)
… теперь следует вызвать get_connection(), чтобы создать экземпляр общего соединения электронной почты:
from django.core.mail import get_connection
connection = get_connection()
messages = get_notification_email()
connection.send_messages(messages)
В зависимости от значения параметра EMAIL_BACKEND SMTP-соединение может не возвращаться. Если вам явно требуется SMTP-соединение для отправки электронной почты, вы можете явно запросить SMTP-соединение:
from django.core.mail import get_connection
connection = get_connection("django.core.mail.backends.smtp.EmailBackend")
messages = get_notification_email()
connection.send_messages(messages)
Если ваш вызов для создания экземпляра SMTPConnection требует дополнительных аргументов, эти аргументы можно передать в вызов get_connection():
connection = get_connection(
"django.core.mail.backends.smtp.EmailBackend", hostname="localhost", port=1234
)
API сообщений пользователей¶
API для хранения сообщений в пользовательской модели Message (через user.message_set.create) теперь устарел и будет удален в Django 1.4 в соответствии со стандартным процессом выпуска.
Чтобы обновить код, вам необходимо заменить все экземпляры этого:
user.message_set.create("a message")
…со следующим:
from django.contrib import messages
messages.add_message(request, messages.INFO, "a message")
Кроме того, если вы используете этот метод, вам необходимо заменить следующее:
for message in user.get_and_delete_messages():
...
…с:
from django.contrib import messages
for message in messages.get_messages(request):
...
Для получения дополнительной информации см. полную документацию по сообщениям. Вам следует немедленно начать обновлять свой код, чтобы использовать новый API.
Вспомогательные функции формата даты¶
django.utils.translation.get_date_formats() и django.utils.translation.get_partial_date_formats() устарели в пользу соответствующих вызовов django.utils.formats.get_format(), которые учитывают локаль, когда для USE_L10N установлено значение True, и возвращаются к настройкам по умолчанию, если установлено значение True. Ложь.
Чтобы получить разные форматы даты, вместо того, чтобы писать это:
from django.utils.translation import get_date_formats
date_format, datetime_format, time_format = get_date_formats()
…использовать:
from django.utils import formats
date_format = formats.get_format("DATE_FORMAT")
datetime_format = formats.get_format("DATETIME_FORMAT")
time_format = formats.get_format("TIME_FORMAT")
Или при прямом форматировании значения даты:
from django.utils import formats
value_formatted = formats.date_format(value, "DATETIME_FORMAT")
То же самое относится и к глобальным переменным, найденным в django.forms.fields:
DEFAULT_DATE_INPUT_FORMATSDEFAULT_TIME_INPUT_FORMATSDEFAULT_DATETIME_INPUT_FORMATS
Используйте django.utils.formats.get_format(), чтобы получить соответствующие форматы.
Средства запуска тестов на основе функций¶
Django 1.2 меняет инструменты запуска тестов, чтобы использовать подход на основе классов. Старые средства запуска тестов на основе функций по-прежнему будут работать, но их следует обновить для использования новых средств запуска тестов на основе классов <topics-testing-test_runner>`.
Идентификаторы технических сообщений¶
До версии 1.1 Django использовал идентификаторы технических сообщений, чтобы предоставить локализаторам возможность переводить форматы даты и времени. Это были переводимые строки перевода, которые можно было распознать, поскольку все они были в верхнем регистре (например, DATETIME_FORMAT, DATE_FORMAT, TIME_FORMAT). Они устарели в пользу новой инфраструктуры Формат локализации, которая позволяет локализаторам указывать эту информацию в файле formats.py в соответствующем каталоге django/conf/locale/<имя локали>/.
ГеоДжанго¶
Чтобы обеспечить поддержку нескольких баз данных, внутренние компоненты базы данных GeoDjango были существенно изменены. Самым большим изменением, несовместимым с предыдущими версиями, является то, что модуль django.contrib.gis.db.backend был переименован в django.contrib.gis.db.backends, где теперь существуют полноценные бэкэнды пространственной базы данных. В следующих разделах представлена информация о наиболее популярных API, на которые повлияли эти изменения.
Пространственный бэкенд¶
До создания отдельных пространственных бэкэндов объект django.contrib.gis.db.backend.SpatialBackend предоставлялся как абстракция для анализа возможностей пространственной базы данных. Все атрибуты и процедуры, предоставляемые SpatialBackend, теперь являются частью атрибута ops серверной части базы данных.
Старый модуль django.contrib.gis.db.backend по-прежнему предоставляется для доступа с обратной совместимостью к объекту SpatialBackend, который является всего лишь псевдонимом модуля ops default пространственного соединения с базой данных.
Пользователи, которые полагались на недокументированные модули и объекты в django.contrib.gis.db.backend, а не на абстракции, предоставляемые SpatialBackend, должны изменить свой код. Например, следующий импорт, который будет работать в версии 1.1 и ниже:
from django.contrib.gis.db.backend.postgis import PostGISAdaptor
Надо будет поменять:
from django.db import connection
PostGISAdaptor = connection.ops.Adapter
Модели SpatialRefSys и GeometryColumns.¶
В предыдущих версиях GeoDjango django.contrib.gis.db.models имел модели SpatialRefSys и GeometryColumns для запроса таблиц пространственных метаданных OGC spatial_ref_sys и geometry_columns соответственно.
Хотя эти псевдонимы по-прежнему предоставляются, они предназначены только для подключения к базе данных по умолчанию и существуют только в том случае, если подключение по умолчанию использует поддерживаемый сервер пространственной базы данных.
Примечание
Поскольку структура таблиц пространственных метаданных OGC различается в разных базах данных, модели SpatialRefSys и GeometryColumns больше не могут быть связаны с именем приложения gis. Таким образом, при использовании метода get_models в следующем примере модели не будут возвращены:
>>> from django.db.models import get_app, get_models
>>> get_models(get_app("gis"))
[]
Чтобы получить правильные SpatialRefSys и GeometryColumns для вашей пространственной базы данных, используйте методы, предоставляемые пространственным бэкэндом:
>>> from django.db import connections >>> SpatialRefSys = connections["my_spatialite"].ops.spatial_ref_sys() >>> GeometryColumns = connections["my_postgis"].ops.geometry_columns()
Примечание
При использовании моделей, возвращаемых методами spatial_ref_sys() и geometry_columns(), вам все равно потребуется использовать правильный псевдоним базы данных при запросе к соединению, отличному от стандартного. Другими словами, чтобы гарантировать, что модели в приведенном выше примере используют правильную базу данных:
sr_qs = SpatialRefSys.objects.using("my_spatialite").filter(...)
gc_qs = GeometryColumns.objects.using("my_postgis").filter(...)
Код языка нет¶
Используемый в настоящее время языковой код норвежского букмола «no» заменяется более распространенным языковым кодом «nb».
Загрузчики шаблонов на основе функций¶
Django 1.2 меняет механизм загрузки шаблонов, чтобы использовать подход на основе классов. Старые загрузчики шаблонов на основе функций по-прежнему будут работать, но их следует обновить для использования новых загрузчиков шаблонов на основе классов.