Что нового в Django 3.1
Оригинальная статья: William S. Vincent — What’s New in Django 3.1
Django 3.1 будет выпущен в начале августа 2020 года и будет содержат ряд важных новых функций и множество мелких улучшений, включая асинхронные представления и поддержку middleware, асинхронные тесты, JSONField для всех поддерживаемых серверных баз данных (не только PostgreSQL), обновленную страницу администратора, SECURE_REFERRER_POLICY, и многое другое. Официальные примечания к выпуску являются каноническим справочным материалом, а в этом посте я постараюсь осветить некоторые основные моменты, а также дать советы по обновлению.
Как обновится
Всегда желательно быть в курсе последней версии Django и Python и по возможности переводить проект на эти версии. Это приведет к более быстрому, более поддерживаемому и функционально загруженному коду. Чтобы выполнить обновление, создайте новую виртуальную среду, установите Django 3.1 и запустите свой набор тестов (у вас же они есть, да?), Добавьте флаг -Wa, чтобы отобразить полные предупреждения об устаревании.
(env) $ python -Wa manage.py test
Если у вас еще нет тестов в вашем проекте, вы все равно можете использовать python -Wa manage.py runserver, чтобы увидеть некоторые предупреждения. Обратитесь к официальному списку обновлений для получения дополнительной информации.
Django 3.1 требует Python 3.6, 3.7 или 3.8. Вы можете прочитать больше о поддерживаемых версиях Python на странице предварительных требований Django. Если вам интересно узнать о версии и политике выхода версий Django, на странице download отображается график поддерживаемых версий и будущие выпуски LTS (долгосрочная поддержка).
Для большего контекста, подкаст Django Chat, организованный совместно сотрудником Django Карлтоном Гибсоном, имеет эпизоды о Django Versions и Django Security Releases.
Асинхронные представления, middleware и тесты
С версией 3.0 Django всерьез начал свое асинхронное путешествие с поддержкой ASGI. В версии 3.1 Django теперь поддерживает полностью асинхронный путь запроса с views, middleware и tests.
Базовый пример, представленный в документации, — это сделать запрос, который ждет полсекунды, а затем возвращает ответ.
# views.py async def my_view(request): await asyncio.sleep(0.5) return HttpResponse('Hello, async world!')
Это работает независимо от того, используете ли вы режим WSGI или ASGI, который был впервые добавлен в 3.0.
Более актуальный пример будет асинхронная загрузка URL-адреса в Django с использованием HTTPX, версии популярной библиотеки requests следующего поколения.
Кросс поддержка — db JSONField
Поддержка JSONField для моделей и форм теперь распространена на все поддерживаемые Django бэкэнды (MariaDB, MySQL, Oracle и SQLite), а не только на PostgreSQL. Это обеспечивает полную поддержку запросов JSONField.
# models.py from django.db import models class SoccerInfo(models.Model): data = models.JSONField() SoccerInfo.objects.create(data={ 'team': 'Liverpool FC', 'coaches': ['Klopp', 'Krawietz'], 'players': {'forwards': ['Salah', 'Firmino', 'Mané']}, }) SoccerInfo.objects.filter( data__team='Liverpool', data__coaches__contains='Klopp', data__players__has_key='forwards', ).delete()
Admin Layout
Админка теперь имеет боковую панель слева для облегчения навигации на больших экранах. Старые хлебные крошки breadcrumbs все еще доступны. Если вы хотите отключить новую боковую панель, установите для AdminSite.enable_nav_sidebar значение False.
Вот старый вид администратора:
А вот новый вид администратора с боковой панелью:
pathlib
Django переключился с использования os.path на более современную и лаконичную pathlib. Если вы создаете новый проект с помощью команды startproject, для автоматически сгенерированного файла settings.py теперь по умолчанию используется pathlib.
Вот версия Django 3.0:
# settings.py import os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }
А вот новая версия Django 3.1:
# settings.py from pathlib import Path BASE_DIR = Path(__file__).resolve(strict=True).parent.parent DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', } }
SECURE_REFERRER_POLICY
SECURE_REFERRER_POLICY теперь по умолчанию имеет ‘same-origin’, что более безопасно. Это один из многих шагов, которые команда Django делает для обеспечения безопасности. Вы можете — и должны — запустить Django deployment checklist, чтобы убедиться, что ваш проект защищен перед началом работы: python manage.py check —deploy.
Заключение
Есть еще много новых функций, подробно описанных в official release notes, которые стоит прочитать полностью, а также сопровождающую документацию по Django 3.1.
Каждый новый релиз Django — это командная работа, и 3.1 не является исключением. Стипендиаты Django, Карлтон Гибсон и Мариуш Фелиаск, внесли большой вклад в общую работу, чтобы гарантировать, что процесс выпуска происходит гладко и в срок. Особую благодарность заслуживают Эндрю Годвин за его работу над асинхронными функциями и Сейдж Абдулла за добавление кросс поддержки базы данных JSONFields.
Если вы хотите поддержать продолжение разработки Django, пожалуйста, сделайте это на официальной странице сбора средств или станьте спонсором GitHub.
Рада что в новом версии есть обновления для страницы администратора.
Спасибо. Но тут не совсем всё. Там на самом деле изменений больше. Подробней можно тут прочитать: https://djangodoc.ru/3.1/releases/3.1/