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

2 декабря 2019 г.,

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

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

См. « Обновление Django до новой версии», если вы обновляете существующий проект.

Совместимость с Python

Django 3.0 требует Python 3.6, 3.7 или 3.8. Мы настоятельно рекомендуем и официально поддерживаем только последнюю версию каждой серии.

Серия Django 2.2.x является последней версией, поддерживающей Python 3.5.

Поддержка сторонних библиотек для более старых версий Django

После выпуска Django 3.0 мы предлагаем, чтобы сторонние приложения больше не поддерживали версии Django старше 2.2. На этом этапе вы должны иметь возможность запускать тесты для своего проекта с помощью python -Wd, чтобы вывести предупреждения об устаревании. После их исправления ваше приложение должно быть совместимо с Django 3.0.

Что нового в Django 3.0

Поддержка MariaDB

Django теперь официально поддерживает MariaDB 10.1 или новее. Прочтите заметки MariaDB для получения более подробной информации.

Поддержка ASGI

Django 3.0 начинает путь к асинхронной функциональности Django, обеспечивая поддержку запуска приложений ASGI .

Это дополнение к существующей поддержке протокола WSGI. Django планирует поддерживать обе версии в будущем. Однако асинхронная функциональность будет доступна только для приложений, работающих с ASGI.

На этом этапе поддержка асинхронного режима применяется только к внешнему приложению ASGI. Внутренне все остается синхронным. Асинхронное промежуточное ПО, представления и т. Д. пока не поддерживаются. Однако вы можете использовать промежуточное ПО ASGI для приложения Django, что позволяет комбинировать Django с другими фреймворками ASGI.

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

Обратите внимание, что побочным эффектом этой новой функции является то, что Django теперь может обнаруживать асинхронные циклы событий и предотвращает вызов кода, помеченного как небезопасный для асинхронного («асинхронный небезопасный»), например операции с ORM из асинхронного контекста. Если вы ранее использовали Django из асинхронного кода, это могло бы привести к сбою, если вы сделали это неправильно. Если вы видите ошибку SynchronousOnlyOperation , внимательно изучите свой код и вместо этого переместите все операции с базой данных в синхронный поток.

Ограничения исключения в PostgreSQL

Новый класс ExclusionConstraint позволяет добавлять ограничения исключения в PostgreSQL. Эти ограничения могут быть добавлены к моделям с помощью опции Meta.constraints .

Выражения фильтра

Выражения, которые дают результаты, BooleanField теперь можно использовать непосредственно в фильтрах QuerySet , без необходимости проходить предыдущую аннотацию и фильтр в этой аннотации.

Перечисления для выбора модельного поля

Пользовательские типы перечисления TextChoices , IntegerChoices и Choices теперь доступны для того , чтобы определить Field.choices . Типы TextChoices и IntegerChoices предоставляются для текстовых и целочисленных полей. Класс Choices позволяет определить перечисление, совместимое с другими типами конкретных данных. Эти настраиваемые типы поддерживают удобные для пользователя метки, которые можно преобразовать и получить с помощью свойства перечисления или его членов. Прочтите « Перечисляемые типы» для получения более подробной информации и примеров.

Незначительные особенности

django.contrib.admin

  • Поддержка атрибутов admin_order_field для свойств в ModelAdmin.list_display .
  • Новый метод ModelAdmin.get_inlines() позволяет определять встроенные подчиненные формы на основе запроса или экземпляра модели.
  • Библиотека Select2 обновлена ​​с версии 4.0.3 до 4.0.7.
  • Встроенная версия jQuery обновлена ​​с 3.3.1 до 3.4.1.

django.contrib.auth

  • Новый атрибут reset_url_token в PasswordResetConfirmView позволяет вам определять параметр токена, отображаемый как компонент URL-адресов для сброса пароля.
  • Класс BaseBackend был добавлен для облегчения настройки механизмов аутентификации.
  • Метод get_user_permissions() был добавлен, чтобы повторить существующий метод get_group_permissions() .
  • Атрибут HTML autocomplete был добавлен в компоненты поля имени пользователя, электронной почты и пароля django.contrib.auth.forms для лучшего взаимодействия с менеджерами паролей браузера.
  • createsuperuser возвращается к переменным среды для полей пароля и других обязательных полей, когда не находит соответствующий параметр в командной строке в неинтерактивном режиме.
  • REQUIRED_FIELDS теперь поддерживает поля ManyToManyField .
  • Новый метод UserManager.with_perm() возвращает пользователей с указанным разрешением.
  • Количество итераций по умолчанию для хэша пароля PBKDF2 увеличено со 150 000 до 180 000.

django.contrib.gis

  • Функции пространственного запроса MySQL теперь работают с реальной геометрией. Ранее учитывались только ограничивающие рамки.
  • GeometryDistance Добавлена функция , поддерживаемая PostGIS.
  • furlong Добавлена ​​опора блока (паза) Distance .
  • Теперь настройка GEOIP_PATH принимает пути pathlib.Path .
  • Теперь класс GeoIP2 принимает пути pathlib.Path .

django.contrib.postgres

  • Новый класс RangeOperators помогает избежать синтаксических ошибок в операторах SQL, которые можно использовать вместе с RangeField .
  • Новое выражение RangeBoundary представляет пределы интервалов.
  • Новые классы AddIndexConcurrently и RemoveIndexConcurrently позволяют создавать и удалять индексы одновременно с PostgreSQL.

django.contrib.sessions

  • Новый метод get_session_cookie_age() позволяет динамически определять возраст файла cookie сеанса.

django.contrib.syndication

Кэш

Файловое хранилище

  • Новый метод Storage.get_alternative_name() позволяет адаптировать алгоритм генерации имен файлов, когда имя загруженного файла уже существует.

Формы

  • Наборы форм могут управлять компонентом, используемым для сортировки форм, с can_order помощью установки атрибута ordering_widget или переопределения get_ordering_widget() .

Интернационализация

  • Настройки LANGUAGE_COOKIE_HTTPONLY , LANGUAGE_COOKIE_SAMESITE и LANGUAGE_COOKIE_SECURE были добавлены в набор флагов HttpOnly , SameSite и Secure на языке печенье. Значения по умолчанию для этих параметров сохраняют историческое поведение.
  • Добавлена ​​поддержка узбекских переводов.

Ведение журнала

  • Новый параметр reporter_class в AdminEmailHandler позволяет обеспечить подкласс , django.views.debug.ExceptionReporter чтобы настроить текст трассировки ошибок отправляются ADMINS на сайт , когда это DEBUG стоит False .

Команды администрирования

  • Новая опция позволяет игнорировать определенные каталоги при поиске файлов для компиляции.compilemessages --ignore .po
  • showmigrations --list теперь отображает дату подачи заявки, когда --verbosity 2 и более.
  • В PostgreSQL dbshell теперь поддерживаются клиентские сертификаты TLS.
  • inspectdb теперь может обнаруживать поля, OneToOneField когда внешний ключ имеет ограничение уникальности или первичного ключа.
  • Новая опция --skip-checks пропускает выполнение системных проверок перед подачей команды.
  • Параметры и теперь поддерживают шаблоны, хранящиеся в архивах XZ ( , ) и LZMA ( , ).startapp --template startproject --template .tar.xz .txz .tar.lzma .tlz

Модели

  • Генерирующие функции базы данных отпечатки ног MD5 , SHA1 , SHA224 , SHA256 , SHA384 и SHA512 были добавлены.

  • Sign Добавлена функция базы данных .

  • Новый параметр is_dst для функций базы данных Trunc определяет обработку несуществующих или неоднозначных времен.

  • connection.queries теперь отображает инструкции с PostgreSQL.COPY TO

  • FilePathField теперь принимает исполняемый объект для path .

  • Симметричные промежуточные таблицы разрешены для саморегулируемых полей ManyToManyField .

  • Атрибуты name из CheckConstraint , UniqueConstraint и в Index настоящее время класс поддержки и применение этикеток интерполяции с использованием '%(app_label)s' и заполнителей '%(class)s' .

  • Новый атрибут Field.descriptor_class позволяет полям шаблона настраивать поведение получения и установки путем переопределения их дескрипторов .

  • Avg и Sum теперь примите параметр distinct .

  • Поле SmallAutoField добавлено; он аналогичен, за AutoField исключением того, что допускает значения только до определенного предела (зависит от базы данных). Значения от 1 до 32767 действительны для всех баз данных, поддерживаемых Django.

  • AutoField , BigAutoField И SmallAutoField теперь наследуют соответственно IntegerField , BigIntegerField и SmallIntegerField . Системные проверки и валидаторы также правильно наследуются.

  • FileField.upload_to теперь принимает пути pathlib.Path .

  • CheckConstraint теперь поддерживается MySQL 8.0.16+.

  • Новый метод allows_group_by_selected_pks_on_model() из django.db.backends.base.BaseDatabaseFeatures Оптимизирует пунктов требовать только первичный ключ выбранных моделей. По умолчанию он поддерживается только для моделей, управляемых с помощью PostgreSQL.GROUP BY

    Чтобы включить оптимизацию только по первичному ключу для неуправляемых моделей, необходимо создать подкласс ядра СУБД PostgreSQL, при необходимости переопределив класс функциональности с помощью метода . См. Пример подклассов интегрированного ядра СУБД .GROUP BY features allows_group_by_selected_pks_on_model()

Запросы и ответы

  • HttpResponse теперь можно инициализировать с помощью содержимого memoryview .
  • Например, для использования в шаблонах Django HttpRequest.headers теперь разрешен поиск с использованием подчеркивания (например user_agent ) вместо дефисов.

Безопасность

  • Значение по умолчанию X_FRAME_OPTIONS - сейчас 'DENY' . В более старых версиях это значение по умолчанию было 'SAMEORIGIN' . Если ваш сайт использует фреймы сами по себе, вам нужно будет явно определить их, чтобы они работали.X_FRAME_OPTIONS = 'SAMEORIGIN'
  • SECURE_CONTENT_TYPE_NOSNIFF теперь по умолчанию True . Если этот параметр включен, SecurityMiddleware устанавливает заголовок X-Content-Type-Options: nosniff для всех ответов, в которых его еще нет.
  • SecurityMiddleware теперь можно отправить заголовок Referrer-Policy .

Тесты

  • Новый параметр raise_request_exception тестового класса Client определяет, должны ли исключения, сгенерированные во время запроса, распространяться в тестах. По умолчанию используется True для обратной совместимости. Когда установлено False и возникает исключение, тестовый клиент вернет ответ 500 с атрибутом exc_info , кортеж, содержащий информацию о возникшем исключении.
  • Тесты и тестовые примеры для запуска можно выбрать по шаблону имени теста с помощью новой опции .test -k
  • Сравнение HTML, используемое в assertHTMLEqual() настоящее время, обрабатывает текст, ссылки на символы и ссылки на сущности, которые ссылаются на один и тот же символ, как на эквиваленты.
  • Средство запуска тестов Django теперь поддерживает режим без интерфейса для тестов Selenium с поддерживаемыми браузерами. Добавьте возможность --headless активировать этот режим.
  • Средство запуска тестов Django теперь поддерживает параметры --start-at и --start-after запускает тесты, начиная с определенного модуля первого уровня.
  • Средство выполнения тестов Django теперь поддерживает возможность --pdb запускать отладчик при каждой ошибке или сбое.

Изменения, несовместимые со старыми версиями Django 3.0

Model.save() при предоставлении значения по умолчанию для первичного ключа

Model.save() больше не пытается найти строку при сохранении нового Model экземпляра и предоставляется значение по умолчанию для первичного ключа, и всегда выполняет один INSERT запрос. В более старых версиях Django Model.save() выполняется либо, INSERT либо в UPDATE зависимости от того, существует ли строка.

Это делает вызов Model.save() при предоставлении значения первичного ключа по умолчанию эквивалентным передаче force_insert = True в модель save() . Попытки использовать новый Model экземпляр для обновления существующей строки приведут к созданию файла IntegrityError .

Чтобы обновить существующую модель для определенного значения первичного ключа, используйте update_or_create() метод или QuerySet.filter(pk=…).update(…) вместо него. Например:

>>> MyModel.objects.update_or_create(pk=existing_pk, defaults={'name': 'new name'})
>>> MyModel.objects.filter(pk=existing_pk).update(name='new name')

API ядра СУБД

В этом разделе описаны изменения, которые могут потребоваться в сторонних ядрах баз данных.

  • Вторым параметром DatabaseIntrospection.get_geometry_type() теперь является описание строки вместо имени столбца.
  • DatabaseIntrospection.get_field_type() больше не обязательно возвращает кортежи.
  • Если база данных может создавать внешние ключи в том же операторе SQL, который добавляет поле, добавьте атрибут SchemaEditor.sql_create_column_inline_fk в ее механизм с соответствующим содержимым SQL; в противном случае установите .DatabaseFeatures.can_create_inline_fk = False
  • DatabaseFeatures.can_return_id_from_insert и can_return_ids_from_bulk_insert переименованы в can_return_columns_from_insert и can_return_rows_from_bulk_insert .
  • Функции базы данных теперь поддерживают форматы datetime.timezone при создании с экземплярами datetime.timedelta (например timezone(timedelta(hours=5)) , которые будут выводить 'UTC+05:00' ). Третий двигатель должен учитывать этот аспект при подготовке DateTimeField в datetime_cast_date_sql() , и datetime_extract_sql() т.д.
  • Строки добавляются DatabaseOperations.integer_field_ranges для полей AutoField , BigAutoField а также в SmallAutoField целях поддержки валидаторов диапазона целых чисел для этих типов полей. Сторонним движкам, возможно, придется адаптировать строки по умолчанию.
  • DatabaseOperations.fetch_returned_insert_id() заменяется на fetch_returned_insert_columns() то, что возвращает список значений, возвращаемых оператором, вместо одного значения.INSERT RETURNING
  • DatabaseOperations.return_insert_id() заменяется на return_insert_columns() то, что принимает параметр, fields который является итеративным из полей, возвращаемых после вставки. Обычно это просто автоматически сгенерированное поле первичного ключа.

django.contrib.admin

  • Сообщения об изменении истории шаблонов сайта администрирования теперь предпочитают более читаемые метки полей, а не имена полей.

django.contrib.gis

  • Поддержка PostGIS 2.1 была удалена.
  • Поддержка SpatiaLite 4.1 и 4.2 была удалена.
  • Поддержка GDAL 1.11 и GEOS 3.4 была удалена.

Прекращение поддержки PostgreSQL 9.4

Поддержка PostgreSQL 9.4 в апстриме заканчивается в декабре 2019 года. Django 3.0 поддерживает PostgreSQL 9.5 и новее.

Прекращение поддержки Oracle 12.1

Поддержка Oracle 12.1 в восходящем направлении заканчивается в июле 2021 года. Django 2.2 будет поддерживаться до апреля 2022 года. Django 3.0 официально поддерживает Oracle 12.2 и 18c.

Частные API совместимости Python 2 были удалены.

Хотя поддержка Python 2 была удалена в Django 2.0, некоторые частные API-интерфейсы не были удалены из Django, чтобы сторонние приложения могли продолжать использовать их до истечения срока действия Python 2.

Поскольку мы ожидаем, что приложения потеряют совместимость с Python 2 при добавлении поддержки Django 3.0, мы удаляем эти API в этом выпуске.

  • django.test.utils.str_prefix() - В Python 3 строки больше не имеют префикса «u».
  • django.test.utils.patch_logger() - Используйте unittest.TestCase.assertLogs() вместо этого.
  • django.utils.lru_cache.lru_cache() - Псевдоним functools.lru_cache() .
  • django.utils.decorators.available_attrs() - Эта функция возвращается functools.WRAPPER_ASSIGNMENTS .
  • django.utils.decorators.ContextDecorator - Псевдоним contextlib.ContextDecorator .
  • django.utils._os.abspathu() - Псевдоним os.path.abspath() .
  • django.utils._os.upath() и npath() - Эти функции больше ничего не делают в Python 3.
  • django.utils.six - Откажитесь от использования этой встроенной библиотеки или перейдите к шести .
  • django.utils.encoding.python_2_unicode_compatible() - Псевдоним six.python_2_unicode_compatible() .
  • django.utils.functional.curry() - Используйте functools.partial() или functools.partialmethod . См. 5b1c389603a353625ae1603 .
  • django.utils.safestring.SafeBytes - Не используется с Django 2.0.

Новая настройка по умолчанию FILE_UPLOAD_PERMISSIONS

В предыдущих версиях настройка FILE_UPLOAD_PERMISSIONS была по None умолчанию. С менеджером по умолчанию FILE_UPLOAD_HANDLERS это может привести к тому, что загруженные файлы будут иметь разные разрешения в зависимости от их размера и, следовательно, от того, какой менеджер загрузки был использован.

FILE_UPLOAD_PERMISSION теперь содержит 0o644 по умолчанию, чтобы избежать этой несогласованности.

Новые настройки безопасности по умолчанию

Чтобы сделать проекты Django более безопасными по умолчанию, некоторые параметры безопасности теперь имеют более безопасные значения по умолчанию:

Дополнительные сведения об этих изменениях см. В разделе безопасности о новых возможностях Django 3.0.

Разное

  • ContentType.__str__() теперь включает метку app_label модели, чтобы различать модели с одинаковыми именами в разных приложениях.
  • Поскольку доступ к языку в сеансе был заменен куки-файлами, он LocaleMiddleware больше не ищет язык пользователя в сеансе и django.contrib.auth.logout() больше не сохраняет язык сеанса после отключения.
  • django.utils.html.escape() теперь использует html.escape() HTML-код для экранирования. Одинарная кавычка ' теперь преобразована ' в эквивалент в десятичном формате ' .
  • Эта опция теперь работает как опция, а не как ярлык .django-admin test -k unittest -k --keepdb
  • Поддержка pywatchman <1.2.0 прекращена.
  • urlencode() Теперь кодирует повторяемые значения такими, какие они есть doseq=False , а не зацикливать их, что ближе к поведению стандартной библиотечной функции urllib.parse.urlencode() .
  • Фильтр шаблонов intword теперь переводит предложение 1.0 в единственном числе, а все другие числовые значения во множественное число, что не всегда правильно на разных языках.
  • Присваивание значения атрибуту '_id' поля ForeignKey или OneToOneField стирание значения соответствующего поля. Любой последующий доступ к этому полю приведет к новому запросу.
  • patch_vary_headers() теперь обрабатывает звездочку '*' в соответствии сRFC 7231 # section-7.1.4 , то есть, если список имен полей заголовка содержит звездочку, заголовокVary будет сформирован с одной звездочкой'*' .
  • С MySQL 8.0.16+, PositiveIntegerField и PositiveSmallIntegerField теперь включает проверочное ограничение для предотвращения отрицательных значений в базе данных.
  • alias=None был добавлен в подпись Expression.get_group_by_cols() .
  • RegexPattern , используемый пользователем re_path() , больше не возвращает аргументы ключевого слова со None значениями, которые должны быть переданы в представление для необязательных именованных групп, которые отсутствуют.

Функции, устаревшие в Django 3.0

django.utils.encoding.force_text() и smart_text()

Псевдонимы smart_text() and force_text() (начиная с Django 2.0) smart_str() и force_str() устарели. Вы можете игнорировать предупреждение, если ваш код поддерживает Python 2, потому что поведение smart_str() и force_str() в этом контексте отличается.

Разное

  • django.utils.http.urlquote() , urlquote_plus() , urlunquote() И urlunquote_plus() являются нежелательными в пользу тех функций , для которых они являются псевдонимами: urllib.parse.quote() , quote_plus() , unquote() и unquote_plus() .
  • django.utils.translation.ugettext() , ugettext_lazy() , ugettext_noop() , ungettext() И ungettext_lazy() являются устаревшими в пользу тех функций , для которых они являются псевдонимами: django.utils.translation.gettext() , gettext_lazy() , gettext_noop() , ngettext() и ngettext_lazy() .
  • Чтобы ограничить создание сеансов и, следовательно, отдать предпочтение определенным стратегиям кеширования, django.views.i18n.set_language() перестанет определять язык пользователя в сеансе из Django 4.0. Начиная с Django 2.1 язык всегда хранится в cookie LANGUAGE_COOKIE_NAME .
  • django.utils.text.unescape_entities() устарело в пользу html.unescape() . Обратите внимание, что в отличие от unescape_entities() , html.unescape() немедленно оценивает отложенные строки.
  • Чтобы избежать возможной путаницы в отношении ее фактического объема, внутренняя частная утилита is_safe_url() была переименована в url_has_allowed_host_and_scheme() . То, что протокол URL и хост разрешены, обычно не означает, что он безопасен. Например, он мог быть неправильно закодирован. Обязательно примените также iri_to_uri() к части пути недоверенных исходных URL.

Функции, удаленные в версии 3.0

Эти функции достигли конца цикла устаревания и постепенно прекращаются в Django 3.0.

Подробную информацию об этих изменениях, а также о том, как отменить использование этих функций, см. В разделе « Функции, не рекомендуемые в версии 2.0» .

  • Модуль django.db.backends.postgresql_psycopg2 удален.
  • django.shortcuts.render_to_response() был удален.
  • Настройка DEFAULT_CONTENT_TYPE удалена.
  • HttpRequest.xreadlines() был удален.
  • Удалена поддержка параметра context from Field.from_db_value() и from Expression.convert_value() .
  • Именованный параметр field_name of QuerySet.earliest() и of latest() был удален.

См. « Функции, не рекомендуемые в Django 2.1» для получения подробной информации об этих изменениях, а также о том, как запретить использование этих функций.

  • Функция ГИС ForceRHR удалена.
  • django.utils.http.cookie_date() был удален.
  • Библиотеки тегов шаблонов staticfiles и admin_static были удалены.
  • django.contrib.staticfiles.templatetags.staticfiles.static() был удален.

Copyright ©2020 All rights reserved