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

1 августа 2016 г.

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

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

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

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

Как и Django 1.9, Django 1.10 требует Python 2.7, 3.4 или 3.5. Мы настоятельно рекомендуем и официально поддерживаем только последний выпуск каждой серии.

Что нового в Django 1.10

Полнотекстовый поиск для PostgreSQL

django.contrib.postgresтеперь включает набор функций базы данных, позволяющий использовать систему полнотекстового поиска. Вы можете выполнять поиск по нескольким полям в своей реляционной базе данных, комбинировать поиски с другими поисками, использовать разные языковые конфигурации и веса, а также ранжировать результаты по релевантности.

Кроме того , в настоящее время включает в себя поддержку триграммы, используя trigram_similar поиск, а TrigramSimilarityи TrigramDistanceвыражение.

Промежуточное ПО нового стиля

Введен новый стиль промежуточного программного обеспечения, чтобы решить проблему отсутствия строгого разделения на уровни запросов / ответов старого стиля промежуточного программного обеспечения, описанного в DEP 0005 . Вам нужно будет адаптировать старое настраиваемое промежуточное ПО и переключиться сMIDDLEWARE_CLASSESнастройки на новую,MIDDLEWARE чтобы воспользоваться улучшениями.

Официальная поддержка имен пользователей Unicode

UserМодель django.contrib.auth изначально только принятых ASCII букв и цифр в именах пользователей. Хотя это не был преднамеренный выбор, символы Unicode всегда принимались при использовании Python 3.

Валидатор имени пользователя теперь явно принимает символы Unicode по умолчанию только на Python 3.

Пользовательские модели могут использовать новый ASCIIUsernameValidatorили UnicodeUsernameValidator.

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

django.contrib.admin

  • Для сайтов, работающих по подпутью, значение по умолчанию в верхней части каждой страницы администратора теперь будет указывать на, если установлено, вместо .URL for the "View site" linkrequest.META['SCRIPT_NAME']/
  • Сообщение об успешном выполнении, которое появляется после добавления или редактирования объекта, теперь содержит ссылку на форму изменения объекта.
  • Весь встроенный JavaScript удален, поэтому вы можете включить Content-Security-PolicyHTTP-заголовок, если хотите.
  • Новый InlineModelAdmin.classesатрибут позволяет указывать классы во встроенных наборах полей. Строки с collapseклассом будут изначально свернуты, а в их заголовке будет небольшая ссылка «показать».
  • Если у пользователя нет разрешения на добавление, object-toolsтеперь будет отображаться блок в списке изменений модели (без кнопки добавления). В этом случае это упрощает добавление пользовательских инструментов.
  • Теперь LogEntryмодель хранит сообщения об изменениях в структуре JSON, чтобы сообщение можно было динамически переводить с использованием текущего активного языка. LogEntry.get_change_message() Теперь предпочтительным способом получения сообщения об изменении является новый метод.
  • Выбранные объекты для полей ModelAdmin.raw_id_fieldsтеперь имеют ссылку на форму изменения объекта.
  • Добавлены варианты «Без даты» и «Имеет дату», DateFieldListFilterесли поле допускает значение NULL.
  • Библиотека jQuery, встроенная в админку, обновлена ​​с версии 2.1.4 до 2.2.3.

django.contrib.auth

  • Добавлена ​​поддержка хэша пароля Argon2 . Рекомендуется использовать вместо PBKDF2, но не по умолчанию, так как для этого требуется сторонняя библиотека.
  • Количество итераций по умолчанию для хешера паролей PBKDF2 увеличено на 25%. Это изменение с обратной совместимостью не повлияет на пользователей, которые создали подклассы, django.contrib.auth.hashers.PBKDF2PasswordHasherчтобы изменить значение по умолчанию.
  • Представление django.contrib.auth.views.logout()отправляет заголовки «без кеширования», чтобы предотвратить проблему, при которой Safari кэширует перенаправления и не позволяет пользователю выйти из системы.
  • Добавлен необязательный backendаргумент, django.contrib.auth.login() позволяющий использовать его без учетных данных.
  • Новый LOGOUT_REDIRECT_URLпараметр управляет перенаправлением django.contrib.auth.views.logout()представления, если представление не получает next_pageаргумент.
  • Новый redirect_authenticated_userпараметр для django.contrib.auth.views.login()представления позволяет перенаправлять аутентифицированных пользователей, посещающих страницу входа.
  • Новые AllowAllUsersModelBackendи AllowAllUsersRemoteUserBackendигнорируют значение User.is_active, ModelBackendа RemoteUserBackendтеперь отклоняют неактивных пользователей.

django.contrib.gis

  • Поисковые запросы расстояния теперь принимают выражения в качестве параметра значения расстояния.
  • Новое GEOSGeometry.unary_unionсвойство вычисляет объединение всех элементов этой геометрии.
  • Добавлен GEOSGeometry.covers()бинарный предикат.
  • Добавлен GDALBand.statistics()метод mean и stdатрибуты.
  • Добавлена ​​поддержка MakeLine агрегатов и GeoHash функций на SpatiaLite.
  • Добавлена поддержка Difference, Intersectionи SymDifference функций на MySQL.
  • Добавлена ​​поддержка создания экземпляров пустой геометрии GEOS.
  • Новые свойства trimи позволяют управлять выводом дробной части координат в WKT.precisionWKTWriter
  • Добавлен LineString.closedи MultiLineString.closedсвойства.
  • Сериализатору GeoJSON Теперь выводит первичный ключ объектов в propertiesсловаре , если не указаны конкретные поля.
  • Добавлена ​​возможность репликации входных данных по GDALBand.data()методу. Данные диапазона теперь можно эффективно обновлять повторяющимися значениями.
  • Добавлены функции базы данных IsValidи MakeValid, а также isvalidпоиск, все для PostGIS. Это позволяет фильтровать и исправлять недопустимую геометрию на стороне базы данных.
  • Добавлена ​​поддержка растров для всех пространственных поисков .

django.contrib.postgres

  • Для удобства HStoreFieldтеперь преобразует свои ключи и значения в строки.

django.contrib.sessions

  • Команда clearsessionsуправления теперь удаляет сеансы на основе файлов.

django.contrib.sites

django.contrib.staticfiles

  • staticШаблонный тег теперь использует , django.contrib.staticfiles если он находится в INSTALLED_APPS. Это особенно полезно для сторонних приложений, которые теперь всегда могут использовать (вместо или ) и не беспокоиться о том, установлено ли приложение.{% load static %}{% load staticfiles %}{% load static from staticfiles %}staticfiles
  • Вы можете легко настроить на вариант с обычаем .collectstatic --ignoreAppConfig

Кэш

  • Бэкэнд файлового кеша теперь использует самый высокий протокол травления.

CSRF

  • По умолчанию CSRF_FAILURE_VIEW, views.csrf.csrf_failure()теперь принимает необязательный template_nameпараметр, по умолчанию '403_csrf.html', для управления шаблоном , используемого для отображения страницы.
  • Для защиты от Breach атак, механизм защиты от CSRF Теперь изменяет значение маркеров формы на каждом запросе (сохраняя при этом инвариантном секрете , который может быть использован для проверки различных символов).

Бэкэнды базы данных

  • Вычитание временных данных унифицировано на всех бэкендах.
  • Если база данных поддерживает это, серверные части могут устанавливать DatabaseFeatures.can_return_ids_from_bulk_insert=Trueи реализовывать DatabaseOperations.fetch_returned_insert_ids()первичные ключи для объектов, созданных с использованием QuerySet.bulk_create().
  • Добавлены ключевые аргументы для as_sql()методов различных выражений ( Func, When, Caseи OrderBy) , чтобы движки базы данных , чтобы настроить их без мутирует self, который не является безопасным при использовании различных движки баз данных. Смотрите arg_joinerи **extra_context параметры Func.as_sql()для примера.

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

  • Движки хранения в настоящее время представляют собой часовой пояс-Aware API с новыми методами get_accessed_time(), get_created_time()и get_modified_time(). Они возвращают часовой пояс, datetimeесли USE_TZесть, Trueи наивный datetimeв местном часовом поясе в противном случае.
  • Новый Storage.generate_filename()метод упрощает реализацию пользовательских хранилищ, которые не используют os.pathвызовы, ранее использовавшиеся в FileField.

Формы

  • Форма и виджет Mediaтеперь обслуживаются с использованием, django.contrib.staticfilesесли они установлены.
  • <input>Тег , оказываемый в CharFieldнастоящее время включает в себя minlengthатрибут , если поле имеет min_length.
  • Обязательные поля формы теперь имеют requiredатрибут HTML. Установите для нового Form.use_required_attribute атрибута значение, Falseчтобы отключить его. requiredАтрибут не включен форм FormSets , поскольку проверка браузер не может быть правильным при добавлении и удалении FormSets.

Общие представления

  • Теперь Viewкласс можно импортировать из django.views.

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

  • i18n_patterns()Вспомогательная функция теперь может быть использована в корне URLconf указанного с помощью request.urlconf.
  • Установив новый prefix_default_languageпараметр для i18n_patterns()to False, вы можете разрешить доступ к языку по умолчанию без префикса URL.
  • set_language()теперь возвращает код состояния 204 (без содержимого) для запросов AJAX, если nextв POSTили нет параметра GET.
  • Представления на основе классов JavaScriptCatalogи JSONCatalogзаменяют устаревшие представления javascript_catalog()и представления на основе json_catalog()функций. Новые представления почти эквивалентны старым, за исключением того, что по умолчанию новые представления собирают все строки JavaScript в djangojs домене перевода из всех установленных приложений, а не только строки JavaScript из LOCALE_PATHS.

Команды управления

  • call_command()теперь возвращает значение, возвращаемое command.handle()методом.
  • Новая опция позволяет указать уровень сообщения, при котором команда завершится с ненулевым статусом.check --fail-level
  • Новая опция заставляет команду завершать работу с ненулевым статусом, когда обнаруживаются изменения модели без миграций.makemigrations --check
  • makemigrations теперь отображает путь к файлам миграции, которые он генерирует.
  • Теперь опция позволяет принудительно использовать «простой» интерпретатор Python.shell --interfacepython
  • Новая опция позволяет вам запустить команду от имени Django и выйти, вместо того, чтобы открывать интерактивную оболочку.shell --command
  • Добавлено предупреждение о dumpdataтом, что прокси-модель указана (что не приводит к выходным данным ) без ее конкретного родителя.
  • Для нового BaseCommand.requires_migrations_checksатрибута может быть установлено значение, Trueесли вы хотите, чтобы ваша команда выводила предупреждение, как это runserverделает, если набор миграций на диске не совпадает с миграциями в базе данных.
  • Чтобы помочь с тестированием, call_command()теперь принимает объект команды в качестве первого аргумента.
  • Команда shellподдерживает завершение табуляции в системах, использующих libedit, например, macOS.
  • Команда inspectdbпозволяет вам выбрать, какие таблицы следует проверить, указав их имена в качестве аргументов.

Миграции

  • Добавлена ​​поддержка сериализации enum.Enumобъектов.
  • Добавлен elidableаргумент для RunSQLи RunPythonопераций , чтобы позволить им быть удалены , когда давя миграции.
  • Добавлена ​​поддержка неатомарных миграций путем установки atomicатрибута в Migration.
  • В migrateи makemigrationsкоманды в настоящее время проверить наличие последовательной истории миграции . Если они обнаруживают неприменимые зависимости применяемой миграции, появляется InconsistentMigrationHistory.
  • pre_migrate()И post_migrate()сигналы в настоящее время отправки их миграции planи apps.

Модели

  • Обратные внешние ключи из прокси-моделей теперь распространяются на их конкретный класс. Обратное отношение, связанное с ForeignKeyуказанием на прокси-модель, теперь доступно в качестве дескриптора в классе прокси-модели и может использоваться при фильтрации набора запросов.
  • Новый Field.rel_db_type() метод возвращает тип данных столбца базы данных для таких полей, как ForeignKey и, OneToOneFieldкоторые указывают на другое поле.
  • arityАтрибут класса добавляется Func. Этот атрибут можно использовать для установки количества аргументов, которые принимает функция.
  • Добавлено BigAutoFieldкоторый действует во многом как AutoFieldкроме того, что он гарантированно соответствовать номера от 1к 9223372036854775807.
  • QuerySet.in_bulk() может быть вызван без каких-либо аргументов для возврата всех объектов в наборе запросов.
  • related_query_nameтеперь поддерживает приложения метки и класса интерполяции с использованием '%(app_label)s'и '%(class)s'строк.
  • Допускается переопределение полей модели, унаследованных от абстрактных базовых классов.
  • prefetch_related_objects()Функция теперь публичный API.
  • QuerySet.bulk_create() устанавливает первичный ключ для объектов при использовании PostgreSQL.
  • Добавлена Castфункция базы данных.
  • Прокси-модель теперь может наследовать несколько прокси-моделей, которые имеют общий неабстрактный родительский класс.
  • Добавлены Extractфункции для извлечения компонентов даты и времени в виде целых чисел, таких как год и час.
  • Добавлены Truncфункции для усечения даты или даты и времени до значимого компонента. Они позволяют выполнять такие запросы, как продажи в день или продажи в час.
  • Model.__init__() теперь устанавливает значения виртуальных полей из своих аргументов ключевого слова.
  • Новые Meta.base_manager_nameи Meta.default_manager_nameопции позволяют контролировать _base_managerи _default_manager, соответственно.

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

  • Добавлено request.userв представление отладки.
  • Добавлены HttpResponseметоды readable()и, seekable()чтобы сделать экземпляр потокоподобным объектом и разрешить его обертывать io.TextIOWrapper.
  • Добавлено HttpRequest.content_typeи content_paramsатрибуты , которые разобраны из CONTENT_TYPEзаголовка.
  • Синтаксический анализатор для request.COOKIESупрощен, чтобы лучше соответствовать поведению браузеров. request.COOKIESтеперь могут содержать файлы cookie, которые недействительны в соответствии сRFC 6265, но их можно установить черезdocument.cookie.

Сериализация

  • django.core.serializers.json.DjangoJSONEncoderТеперь знает , как сериализовать ленивые строки, как правило , используются для переводимого контента.

Шаблоны

  • Добавлена autoescapeопция в DjangoTemplatesбэкэнд и Engineкласс.
  • Добавлены isи сравнения операторов в теге.is notif
  • Разрешено dictsortупорядочить список списков по элементу по указанному индексу.
  • debug()Контекст процессор содержит запросы для всех псевдонимов баз данных вместо только псевдоним по умолчанию.
  • Добавлена ​​поддержка относительного пути для строковых аргументов тегов extendsи includeшаблонов.

Тесты

  • Чтобы лучше TestCaseвыявлять ошибки, теперь проверяет отложенные ограничения базы данных в конце каждого теста.
  • Тесты и тестовые случаи могут быть помечены бирками и работать избирательно с новым и опциями.test --tagtest --exclude-tag
  • Теперь вы можете войти в систему и использовать сеансы с тестовым клиентом, даже если django.contrib.sessionsон не находится в INSTALLED_APPS.

URL-адреса

  • Добавление django.setup()позволяет FORCE_SCRIPT_NAMEучитывать URL-адреса, происходящие вне цикла запроса / ответа (например, в командах управления и автономных скриптах), при его установке.

Валидаторы

  • URLValidator теперь ограничивает длину меток доменных имен до 63 символов, а общую длину доменных имен до 253 символов на RFC 1034 .
  • int_list_validator()теперь принимает необязательный allow_negativeлогический параметр, по умолчанию False, чтобы разрешить отрицательные целые числа.

Обратно несовместимые изменения в 1.10

Предупреждение

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

API серверной части базы данных

  • ГИС AreaFieldиспользует неопределенный базовый числовой тип, который на практике может быть любым числовым типом Python. decimal.Decimalзначения, полученные из базы данных, теперь конвертируются в, floatчтобы упростить их объединение со значениями, используемыми библиотеками ГИС.
  • Чтобы включить временное вычитание, вы должны установить supports_temporal_subtractionфлаг функции базы данных Trueи реализовать DatabaseOperations.subtract_temporals()метод. Этот метод должен возвращать SQL и параметры , необходимый для вычисления разницы в микросекундах между lhsи rhsаргументами в типе данных , используемых для хранения DurationField.

_meta.get_fields()возвращает согласованные обратные поля для прокси-моделей

До Django 1.10 get_fields() метод возвращал разные обратные поля при вызове в модели прокси по сравнению с его конкретным прокси-классом. Это несоответствие было исправлено путем возврата полного набора полей, указывающих на конкретный класс или один из его прокси в обоих случаях.

AbstractUser.username max_lengthувеличена до 150

Перенос для django.contrib.auth.models.User.usernameвключен. Если у вас есть настраиваемая пользовательская модель, наследующая от AbstractUser, вам необходимо создать и применить миграцию базы данных для вашей пользовательской модели.

Мы рассмотрели увеличение до 254 символов, чтобы упростить использование адресов электронной почты (которые ограничены 254 символами) в качестве имен пользователей, но отклонили это из-за ограничений MySQL. При использовании utf8mb4кодировки (рекомендуется для правильной поддержки Unicode) MySQL по умолчанию может создавать уникальные индексы только с 191 символом. Поэтому, если вам нужна большая длина, используйте индивидуальную пользовательскую модель.

Если вы хотите сохранить ограничение в 30 символов для имен пользователей, используйте настраиваемую форму при создании пользователя или изменении имени пользователя:

from django.contrib.auth.forms import UserCreationForm

class MyUserCreationForm(UserCreationForm):
    username = forms.CharField(
        max_length=30,
        help_text='Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.',
    )

Если вы хотите сохранить это ограничение в админке, установите UserAdmin.add_form для использования эту форму:

from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.models import User

class UserAdmin(BaseUserAdmin):
    add_form = MyUserCreationForm

admin.site.unregister(User)
admin.site.register(User, UserAdmin)

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

Поддержка PostgreSQL 9.1 в апстриме заканчивается в сентябре 2016 года. Как следствие, Django 1.10 устанавливает PostgreSQL 9.2 как минимальную официально поддерживаемую версию.

runserverвывод проходит через лог

Обработка запросов и ответов на runserverкоманду отправляется в регистратор django.server, а не в sys.stderr. Если вы отключите конфигурацию ведения журнала Django или замените ее своей собственной, вам нужно будет добавить соответствующую конфигурацию ведения журнала, если вы хотите увидеть этот вывод:

'formatters': {
    'django.server': {
        '()': 'django.utils.log.ServerFormatter',
        'format': '[%(server_time)s] %(message)s',
    }
},
'handlers': {
    'django.server': {
        'level': 'INFO',
        'class': 'logging.StreamHandler',
        'formatter': 'django.server',
    },
},
'loggers': {
    'django.server': {
        'handlers': ['django.server'],
        'level': 'INFO',
        'propagate': False,
    }
}

auth.CustomUserи auth.ExtensionUserтестовые модели были удалены

С момента появления миграции для приложений contrib в Django 1.8 таблицы этих пользовательских тестовых моделей больше не создавались, что делало их непригодными для использования в контексте тестирования.

Реестр приложений больше не заполняется автоматически при извлечении моделей вне Django

Реестр приложений больше не заполняется автоматически при отборе моделей. Это было добавлено в Django 1.7.2 как попытка разрешить распаковку моделей вне Django, например, в RQ worker, без вызова django.setup(), но это создает возможность тупиковой ситуации. Чтобы адаптировать свой код в случае RQ, вы можете предоставить свой собственный рабочий скрипт, который вызывает django.setup().

Удалена проверка нулевого назначения для ненулевых полей внешнего ключа

В более старых версиях присвоение Noneне обнуляемому ForeignKeyили OneToOneFieldподнятому . Для согласованности с другими полями модели, которые не имеют подобной проверки, эта проверка удалена.ValueError('Cannot assign None: "model.field" does not allow null values.')

Удалены хешеры слабых паролей из PASSWORD_HASHERSнастройки по умолчанию

Django 0.90 хранит пароли как несоленые MD5. В Django 0.91 добавлена ​​поддержка соленого SHA1 с автоматическим обновлением паролей при входе пользователя в систему. Django 1.4 добавил PBKDF2 в качестве хэшера паролей по умолчанию.

Если у вас есть старый проект Django с закодированными паролями MD5 или SHA1 (даже солеными), имейте в виду, что их можно довольно легко взломать с помощью современного оборудования. Чтобы пользователи Django признали продолжение использования слабых хешеров, следующие хешеры удалены из PASSWORD_HASHERS настройки по умолчанию :

'django.contrib.auth.hashers.SHA1PasswordHasher'
'django.contrib.auth.hashers.MD5PasswordHasher'
'django.contrib.auth.hashers.UnsaltedSHA1PasswordHasher'
'django.contrib.auth.hashers.UnsaltedMD5PasswordHasher'
'django.contrib.auth.hashers.CryptPasswordHasher'

Рассмотрите возможность использования обернутого хешера паролей для усиления хэшей в вашей базе данных. Если это невозможно, добавьте PASSWORD_HASHERSнастройку в свой проект и добавьте обратно все нужные хешеры.

Вы можете проверить, есть ли в вашей базе данных какие-либо удаленные хешеры, например:

from django.contrib.auth import get_user_model
User = get_user_model()

# Unsalted MD5/SHA1:
User.objects.filter(password__startswith='md5$$')
User.objects.filter(password__startswith='sha1$$')
# Salted MD5/SHA1:
User.objects.filter(password__startswith='md5$').exclude(password__startswith='md5$$')
User.objects.filter(password__startswith='sha1$').exclude(password__startswith='sha1$$')
# Crypt hasher:
User.objects.filter(password__startswith='crypt$$')

from django.db.models import CharField
from django.db.models.functions import Length
CharField.register_lookup(Length)
# Unsalted MD5 passwords might not have an 'md5$$' prefix:
User.objects.filter(password__length=32)

Field.get_prep_lookup()и Field.get_db_prep_lookup()методы удалены

Если у вас есть настраиваемое поле, реализующее любой из этих методов, зарегистрируйте для него настраиваемый поиск. Например:

from django.db.models import Field
from django.db.models.lookups import Exact

class MyField(Field):
    ...

class MyFieldExact(Exact):
    def get_prep_lookup(self):
        # do_custom_stuff_for_myfield
        ....

MyField.register_lookup(MyFieldExact)

django.contrib.gis

  • Поддержка SpatiaLite <3.0 и GEOS <3.3 прекращена.
  • В add_postgis_srs()псевдониме обратной совместимости для django.contrib.gis.utils.add_srs_entry()удаляется.
  • В Oracle / GIS Area агрегатная функция теперь возвращает floatвместо decimal.Decimal. (Он все еще упакован в квадратные метры.)
  • Представление по умолчанию GEOSGeometry(вывод WKT) по умолчанию обрезано. То есть вместо того , чтобы получить .POINT (23.0000000000000000 5.5000000000000000)POINT (23 5.5)

Максимальный размер тела запроса и количество параметров GET / POST ограничены

Два новых параметра помогают снизить уровень атак типа «отказ в обслуживании» с помощью больших запросов:

  • DATA_UPLOAD_MAX_MEMORY_SIZEограничивает размер тела запроса. Загрузки файлов не учитываются в этом лимите.
  • DATA_UPLOAD_MAX_NUMBER_FIELDS ограничивает количество анализируемых параметров GET / POST.

Приложениям, которые получают сообщения необычно большой формы, возможно, потребуется настроить эти параметры.

Разное

  • Объект repr()a QuerySetзавернут, чтобы исключить его из простого списка при отладке.<QuerySet >
  • utils.version.get_version() возвращается Версии-кандидаты, совместимые с PEP 440 (например, «1.10rc1» вместо «1.10c1»).
  • Значения токенов CSRF теперь должны быть строками из 64 букв и цифр; значения из 32 буквенно-цифровых символов, установленные по умолчанию в старых версиях Django, автоматически заменяются строками из 64 символов. Остальные значения считаются недопустимыми. Это должно коснуться только разработчиков или пользователей, которые заменяют эти токены.
  • Этот LOGOUT_URLпараметр удален, поскольку Django не использовал его с версии до 1.0. Если вы используете его в своем проекте, вы можете добавить его в настройки своего проекта. Значение по умолчанию было '/accounts/logout/'.
  • Объекты, которым close()переданы такие методы, как файлы и генераторы HttpResponse, теперь закрываются немедленно, а не тогда, когда сервер WSGI вызывает close()ответ.
  • Избыточный transaction.atomic()вызов QuerySet.update_or_create() удален. Это может повлиять на количество запросов, проверенных TransactionTestCase.assertNumQueries().
  • Поддержка skip_validationin BaseCommand.execute(**options)удалена. skip_checksВместо этого используйте (добавлено в Django 1.7).
  • loaddataтеперь вызывает CommandErrorвместо предупреждения, когда указанный файл фикстуры не найден.
  • Вместо прямого доступа к LogEntry.change_messageатрибуту теперь лучше вызвать LogEntry.get_change_message()метод, который предоставит сообщение на текущем языке.
  • Отображение ошибок по умолчанию теперь увеличивается, TemplateDoesNotExistесли template_nameуказано несуществующее .
  • Неиспользованный choicesключевое слово аргумент Selectи SelectMultipleвиджеты render()метода удаляется. choices Аргумент render_options()метода также удаляется, что делает selected_choicesпервый аргумент.
  • Тесты, которые нарушают отложенные ограничения базы данных, теперь будут вызывать ошибку при запуске в базе данных, которая поддерживает отложенные ограничения.
  • Встроенные команды управления теперь используют индексацию ключей options, например options['verbosity'], вместо приведения options.get()какого-либо типа и больше не выполняют его. Это может быть проблемой, если вы вызываете команды, используя Command.execute()(в обход парсера аргументов, который устанавливает значение по умолчанию) вместо call_command(). Вместо вызова Command.execute()передайте объект команды в качестве первого аргумента функции call_command().
  • ModelBackendи RemoteUserBackendтеперь отклоняйте неактивных пользователей. Это означает, что неактивные пользователи не могут войти в систему и выйдут из системы при переключении с is_active=Trueна False. Если вам нужно предыдущее поведение, используйте вместо него новый AllowAllUsersModelBackendили AllowAllUsersRemoteUserBackend in AUTHENTICATION_BACKENDS.
  • В свете предыдущего изменения метод тестового клиента login()больше не всегда отклоняет неактивных пользователей, а вместо этого делегирует это решение бэкэнду аутентификации. force_login()также делегирует решение бэкэнду аутентификации, поэтому, если вы используете бэкэнд по умолчанию, вам нужно использовать активного пользователя.
  • django.views.i18n.set_language() теперь может возвращать код состояния 204 для запросов AJAX.
  • base_fieldАтрибут RangeFieldтеперь тип поля, не является экземпляром поля. Если вы создали собственный подкласс RangeField, вам следует изменить base_fieldатрибут.
  • Классы промежуточного программного обеспечения теперь инициализируются при запуске сервера, а не во время первого запроса.
  • Если вы переопределяете is_authenticated()или is_anonymous()в пользовательской модели пользователя, вы должны преобразовать их в атрибуты или свойства, как описано в примечании об устаревании .
  • При использовании ModelAdmin.save_as=Trueкнопка «Сохранить как новый» теперь перенаправляет на вид изменений для нового объекта, а не на список изменений модели. Если вам нужно предыдущее поведение, установите для нового ModelAdmin.save_as_continueатрибута значение False.
  • Обязательные поля формы теперь имеют requiredатрибут HTML. Установите для Form.use_required_attribute атрибута значение, Falseчтобы отключить его. Вы также можете добавить novalidate атрибут, <form>если не хотите проверки браузера. Чтобы отключить requiredатрибут в пользовательских виджетах, переопределите Widget.use_required_attribute() метод.
  • Обработчик WSGI больше не удаляет содержимое ответов из HEAD запросов или ответов со status_codeзначениями 100–199, 204 или 304. Большинство веб-серверов уже реализуют это поведение. К ответам, полученным с помощью тестового клиента Django, по-прежнему применяются эти «исправления ответов».
  • Model.__init__()теперь получает django.db.models.DEFERREDкак значение отложенных полей.
  • Model._deferredАтрибут удаляется как динамические модели классов при использовании QuerySet.defer()и only()удаляется.
  • Storage.save()больше не заменяется '\'на '/'. Это поведение перемещено, FileSystemStorageпоскольку это конкретная деталь реализации хранилища. Любой пользователь Windows с реализацией настраиваемого хранилища, который полагается на это поведение, должен будет реализовать его в save()методе настраиваемого хранилища .
  • Частные FileFieldметоды get_directory_name() и get_filename()не больше не вызывается (и теперь устаревшее) , который является назад несовместимое изменение для пользователей этих методов временной отмены пользовательских полей. Чтобы адаптировать такой код, переопределите FileField.generate_filename()или Storage.generate_filename()вместо него. Возможно upload_toтакже использовать .
  • Тема письма, отправляемого пользователем AdminEmailHandler, больше не обрезается до 989 символов. Если вы рассчитывали на ограниченную длину, обрежьте тему самостоятельно.
  • Частные выражения django.db.models.expressions.Dateи DateTime удаляются. Новые Truncвыражения обеспечивают ту же функциональность.
  • _base_managerИ _default_managerатрибуты удаляются из экземпляров модели. Они остаются доступными в классе модели.
  • Доступ к удаленному полю в экземпляре модели, например, после , перезагружает значение поля вместо увеличения .del obj.fieldAttributeError
  • Если вы создаете подкласс AbstractBaseUserи переопределяете clean(), убедитесь, что он вызывает super(). AbstractBaseUser.normalize_username()вызывается в новом AbstractBaseUser.clean()методе.
  • Частный API django.forms.models.model_to_dict()возвращает набор запросов, а не список первичных ключей для ManyToManyFields.
  • Если django.contrib.staticfilesустановлен, static тег шаблона использует staticfilesхранилище для создания URL-адреса, а не просто объединяет значение с STATIC_ROOT. Новый подход кодирует URL-адрес, который может быть обратно несовместимым в таких случаях, как включение фрагмента в путь, например , поскольку кодируется как . Для того, чтобы адаптировать, переместить фрагмент вне тег шаблона: .{% static 'img.svg#fragment' %}#%23{% static 'img.svg' %}#fragment
  • Когда USE_L10Nэто True, локализация в настоящее время применяется для dateи timeфильтров , когда не указана строка формата. Спецификаторы DATE_FORMATи TIME_FORMATиз активного языкового стандарта используются вместо одноименных настроек.

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

Прямое присвоение обратному внешнему ключу или отношению «многие ко многим»

Вместо присвоения связанных объектов с использованием прямого присвоения:

>>> new_list = [obj1, obj2, obj3]
>>> e.related_set = new_list

Используйте set()метод, добавленный в Django 1.9:

>>> e.related_set.set([obj1, obj2, obj3])

Это предотвращает путаницу в отношении присвоения, приводящую к неявному сохранению.

StorageAPI без учета часовых поясов

Старые методы accessed_time(), не учитывающие часовые пояса created_time(), и modified_time()устарели в пользу новых get_*_time() методов.

Сторонние серверные части хранилища должны реализовать новые методы и пометить старые как устаревшие. А пока новые get_*_time()методы базового Storageкласса преобразуют datetimeстарые методы по мере необходимости и при этом выдают предупреждение об устаревании.

Сторонние серверные части хранилища могут сохранять старые методы до тех пор, пока они хотят поддерживать более ранние версии Django.

django.contrib.gis

  • get_srid()И set_srid()методы GEOSGeometryявляются устаревшими в пользу sridсобственности.
  • get_x(), set_x(), get_y(), set_y(), get_z(), И set_z()методы Pointявляются устаревшими в пользу x, yи zсвойств.
  • get_coords()И set_coords()методы Pointявляются устаревшими в пользу tupleсобственности.
  • cascaded_unionСвойство MultiPolygonявляется устаревшим в пользу unary_unionсобственности.
  • django.contrib.gis.utils.precision_wkt()Функция устарела в пользу WKTWriter.

CommaSeparatedIntegerFieldполе модели

CommaSeparatedIntegerFieldосуждается в пользу CharFieldс validate_comma_separated_integer_list() валидатора:

from django.core.validators import validate_comma_separated_integer_list
from django.db import models

class MyModel(models.Model):
    numbers = models.CharField(..., validators=[validate_comma_separated_integer_list])

Если вы используете Oracle, CharFieldиспользуется другой тип поля базы данных ( NVARCHAR2), чем CommaSeparatedIntegerField( VARCHAR2). В зависимости от настроек вашей базы данных это может означать другую кодировку и, следовательно, другую длину (в байтах) для одного и того же содержимого. Если ваши сохраненные значения длиннее предела в 4000 байт NVARCHAR2, вы должны использовать вместо этого TextField ( NCLOB). В этом случае, если у вас есть какие-либо запросы, группирующиеся по полю (например, аннотирование модели с помощью агрегирования или использования distinct()), вам необходимо изменить их (чтобы отложить поле).

__searchпоиск по запросу

searchПоиск, который поддерживает MySQL только и крайне ограничен в особенности, является устаревшим. Замените его настраиваемым поиском:

from django.db import models

class Search(models.Lookup):
    lookup_name = 'search'

    def as_mysql(self, compiler, connection):
        lhs, lhs_params = self.process_lhs(compiler, connection)
        rhs, rhs_params = self.process_rhs(compiler, connection)
        params = lhs_params + rhs_params
        return 'MATCH (%s) AGAINST (%s IN BOOLEAN MODE)' % (lhs, rhs), params

models.CharField.register_lookup(Search)
models.TextField.register_lookup(Search)

Использование методов User.is_authenticated()и User.is_anonymous()как

В is_authenticated()и is_anonymous()методы AbstractBaseUserи AnonymousUserклассы теперь свойства. Они по-прежнему будут работать как методы до Django 2.0, но все их использование в Django теперь использует доступ по атрибутам.

Например, если вы используете AuthenticationMiddlewareи хотите узнать, вошел ли пользователь в систему в настоящее время, вы должны использовать:

if request.user.is_authenticated:
    ... # Do something for logged-in users.
else:
    ... # Do something for anonymous users.

вместо request.user.is_authenticated().

Это изменение позволяет избежать случайной утечки информации, если вы забудете вызвать метод, например:

if request.user.is_authenticated:
    return sensitive_information

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

Django использует CallableBoolобъект, чтобы эти атрибуты работали как свойство, так и как метод. Таким образом, пока не закончится период устаревания, вы не сможете сравнивать эти свойства с помощью isоператора. То есть не сработает следующее:

if request.user.is_authenticated is True:
    ...

«Побег» половина django.utils.safestring

mark_for_escaping()Функции и классы , которые он использует: EscapeData, EscapeBytes, EscapeText, EscapeStringи EscapeUnicodeявляются устаревшими.

В результате «ленивое» поведение escapeфильтра (когда он всегда будет применяться в качестве последнего фильтра, независимо от того, где в цепочке фильтров он появился) не рекомендуется. Фильтр изменится на немедленное применение conditional_escape()в Django 2.0.

Разное

  • Устарели в пользу варианты.makemigrations --exitmakemigrations --check
  • django.utils.functional.allow_lazy()устарел в пользу новой keep_lazy()функции, которую можно использовать с более естественным синтаксисом декоратора.
  • Этот параметр устарел в пользу или .shell --plain-i python--interface python
  • Импорт из django.core.urlresolversмодуля является устаревшим в пользу нового места, django.urls.
  • Метод шаблона Context.has_key()устарел в пользу in.
  • Частный атрибут virtual_fieldsиз Model._metaосуждается в пользу private_fields.
  • Аргументы частного ключевого слова virtual_onlyin Field.contribute_to_class()и virtualin Model._meta.add_field()устарели в пользу private_only и private, соответственно.
  • Представления javascript_catalog()и json_catalog()устарели в пользу представлений на основе классов JavaScriptCatalog и JSONCatalog.
  • При многотабличном наследовании неявное преобразование a OneToOneFieldв a parent_linkне рекомендуется. Добавьте parent_link=Trueв такие поля.
  • Частный API Widget._format_value()становится общедоступным и переименовывается в format_value(). Старое имя будет работать в течение периода устаревания.
  • Частные FileFieldметоды get_directory_name()и get_filename() не рекомендуются в пользу выполнения этой работы в Storage.generate_filename()).
  • Используемое промежуточное ПО в старом стиле settings.MIDDLEWARE_CLASSESустарело. Адаптируйте старое настраиваемое промежуточное ПО и используйте новую MIDDLEWAREнастройку.

Функции, удаленные в 1.10

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

  • Поддержка SQLCompilerпрямого вызова a как псевдонима для вызова его quote_name_unless_aliasметода удалена.
  • cycleИ firstofтеги шаблонов удаляются из future библиотеки шаблонов тегов.
  • django.conf.urls.patterns() устранен.
  • Поддержка prefixаргумента для django.conf.urls.i18n.i18n_patterns()удалена.
  • SimpleTestCase.urls устранен.
  • Использование неправильного подсчета распакованных значений в forтеге шаблона вызывает исключение, а не приводит к ошибке.
  • Возможность reverse()URL-адресов с использованием пути Python, разделенного точками, удалена.
  • Возможность использовать точечный путь Python для LOGIN_URLи LOGIN_REDIRECT_URLнастроек удаляются.
  • Поддержка optparseпользовательских команд управления прекращена.
  • Класс django.core.management.NoArgsCommandудален.
  • django.core.context_processors модуль удален.
  • django.db.models.sql.aggregates модуль удален.
  • django.contrib.gis.db.models.sql.aggregates модуль удален.
  • Удаляются следующие методы и свойства django.db.sql.query.Query:
    • Свойства: aggregatesиaggregate_select
    • Методы add_aggregate, set_aggregate_maskи append_aggregate_mask.
  • django.template.resolve_variable устранен.
  • Следующие частные API удалены из django.db.models.options.Options( Model._meta):
    • get_field_by_name()
    • get_all_field_names()
    • get_fields_with_model()
    • get_concrete_fields_with_model()
    • get_m2m_with_model()
    • get_all_related_objects()
    • get_all_related_objects_with_model()
    • get_all_related_many_to_many_objects()
    • get_all_related_m2m_objects_with_model()
  • error_messageАргумент django.forms.RegexFieldудаляется.
  • Не unordered_listфильтр больше не поддерживает старые списки стилей.
  • Поддержка строковых viewаргументов для url()удалена.
  • Обратная совместимость прокладка переименовать django.forms.Form._has_changed() в has_changed()удаляется.
  • removetagsШаблон фильтр удаляется.
  • Функции remove_tags()и strip_entities()в django.utils.htmlудалены.
  • is_admin_siteАргумент django.contrib.auth.views.password_reset()удаляется.
  • django.db.models.field.subclassing.SubfieldBase устранен.
  • django.utils.checksums устранен.
  • original_content_type_idАтрибут django.contrib.admin.helpers.InlineAdminFormудаляется.
  • Прокладка обратной совместимости, позволяющая FormMixin.get_form()определять без значения по умолчанию для ее form_classаргумента, удаляется.
  • Следующие настройки будут удалены, и вы должны обновить их до TEMPLATESнастройки:
    • ALLOWED_INCLUDE_ROOTS
    • TEMPLATE_CONTEXT_PROCESSORS
    • TEMPLATE_DEBUG
    • TEMPLATE_DIRS
    • TEMPLATE_LOADERS
    • TEMPLATE_STRING_IF_INVALID
  • Псевдоним обратной совместимости django.template.loader.BaseLoaderудален.
  • Объекты шаблонов Django, возвращаемые get_template()и select_template()больше не принимающие Contextв своем render()методе.
  • API-интерфейсы шаблонов ответов предписывают использованиеdictобъектов шаблона и, зависящихот серверной части, вместо Contextи,Template соответственно.
  • current_appПараметр для следующей функции и классы удаляют:
    • django.shortcuts.render()
    • django.template.Context()
    • django.template.RequestContext()
    • django.template.response.TemplateResponse()
  • Эти dictionaryи context_instanceпараметры для следующих функций удаляются:
    • django.shortcuts.render()
    • django.shortcuts.render_to_response()
    • django.template.loader.render_to_string()
  • Удален dirsпараметр для следующих функций:
    • django.template.loader.get_template()
    • django.template.loader.select_template()
    • django.shortcuts.render()
    • django.shortcuts.render_to_response()
  • Проверка сеанса включена независимо от того , или нет , 'django.contrib.auth.middleware.SessionAuthenticationMiddleware'в MIDDLEWARE_CLASSES. SessionAuthenticationMiddlewareбольше не имеет цели и может быть удален из MIDDLEWARE_CLASSES. Он хранится в виде заглушки до Django 2.0 в качестве любезности для пользователей, которые не читают эту заметку.
  • Приватный атрибут django.db.models.Field.relatedудален.
  • --listВариант из migrateкоманды управления удаляется.
  • ssiШаблонный тег удаляется.
  • Поддержка =оператора сравнения в ifтеге шаблона удалена.
  • Прокладки обратной совместимости, разрешающие Storage.get_available_name() и Storage.save()определяемые без max_lengthаргументов, удаляются.
  • Поддержка устаревшего %(<foo>)sсинтаксиса в ModelFormMixin.success_url .
  • GeoQuerySetагрегатные методы collect(), extent(), extent3d(), make_line(), и unionagg()удаляются.
  • Возможность указывать ContentType.nameпри создании экземпляра типа контента удалена.
  • Поддержка старой подписи allow_migrateудалена.
  • Поддержка синтаксиса, в котором используются аргументы, разделенные запятыми, удалена.{% cycle %}
  • Предупреждение, которое Signerвыдается при указании недопустимого разделителя, теперь имеет вид ValueError.

Copyright ©2021 All rights reserved