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

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

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

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

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

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

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

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

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

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

Что нового в 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()метода.
  • Добавлен autocompleteатрибут HTML в виджеты полей имени пользователя, электронной почты и пароля django.contrib.auth.formsдля лучшего взаимодействия с менеджерами паролей браузера.
  • createsuperuser теперь возвращается к переменным среды для пароля и обязательных полей, когда соответствующий аргумент командной строки не указан в неинтерактивном режиме.
  • REQUIRED_FIELDSтеперь поддерживает ManyToManyFields.
  • Новый UserManager.with_perm()метод возвращает пользователей с указанным разрешением.
  • Счетчик итераций по умолчанию для хешера паролей PBKDF2 увеличен со 150 000 до 180 000.

django.contrib.gis

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

django.contrib.postgres

  • Новое RangeOperatorsпомогает избежать опечаток в операторах SQL, которые можно использовать вместе с RangeField.
  • Новое RangeBoundaryвыражение представляет границы диапазона.
  • Новые AddIndexConcurrently и RemoveIndexConcurrently классы позволяют создавать и удаление индексов CONCURRENTLYна 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 --templatestartproject --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 BYallows_group_by_selected_pks_on_model()

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

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

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

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

Тесты

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

Обратно несовместимые изменения в 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()и т.д.
  • Записи для AutoField, BigAutoFieldи SmallAutoFieldдобавляются для DatabaseOperations.integer_field_rangesподдержки валидаторов целочисленного диапазона для этих типов полей. Сторонним серверным модулям может потребоваться настроить записи по умолчанию.
  • 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() - Строки не имеют префиксов u в Python 3.
  • 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_PERMISSIONSтеперь по умолчанию используется, чтобы 0o644избежать этого несоответствия.

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

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

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

Разное

  • ContentType.__str__()теперь включает модели app_labelдля устранения неоднозначности моделей с одинаковыми именами в разных приложениях.
  • Поскольку доступ к языку в сеансе, а не в LocaleMiddlewareфайле cookie устарел, он больше не ищет язык пользователя в сеансе и django.contrib.auth.logout()больше не сохраняет язык сеанса после выхода из системы.
  • django.utils.html.escape()теперь используется html.escape()для экранирования HTML. Он преобразуется 'в 'вместо предыдущего эквивалентного десятичного кода '.
  • Эта опция теперь работает как опция, а не как ярлык для .django-admin test -kunittest -k--keepdb
  • Поддержка pywatchman<1.2.0 удалена.
  • urlencode()теперь кодирует итерируемые значения такими, какие они есть doseq=False, а не повторяет их, приводя их в соответствие со стандартной библиотечной urllib.parse.urlencode()функцией.
  • intwordшаблонный фильтр теперь переводится 1.0как фраза в единственном числе, а все другие числовые значения как множественное число. Это может быть неверно для некоторых языков.
  • Присвоение значения атрибуту модели ForeignKeyили теперь отменяет установку соответствующего поля. Последующий доступ к полю приведет к запросу.OneToOneField '_id'
  • 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значениями, которые должны быть переданы в представление для необязательных именованных групп, которые отсутствуют.

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

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

smart_text()И 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 язык всегда сохраняется в LANGUAGE_COOKIE_NAMEcookie.
  • 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аргумента о Field.from_db_value()и Expression.convert_value()удалена.
  • field_nameКлючевое слово аргумент QuerySet.earliest()и latest()удаляется.

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

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

Copyright ©2021 All rights reserved