Что нового в Django 3.1

Spread the love

Оригинальная статья: William S. VincentWhat’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.

Вот старый вид администратора:

Django 3.0 Admin

А вот новый вид администратора с боковой панелью:

Django 3.1 Admin

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.

Была ли вам полезна эта статья?
[6 / 4.8]

Spread the love
Подписаться
Уведомление о
guest
2 Комментарий
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Катя
3 лет назад

Рада что в новом версии есть обновления для страницы администратора.

Анонимно
Анонимно
3 лет назад

Спасибо. Но тут не совсем всё. Там на самом деле изменений больше. Подробней можно тут прочитать: https://djangodoc.ru/3.1/releases/3.1/