Python学習チャンネル by PyQ

Pythonのオンライン学習プラットフォームPyQのオフィシャルブログです

Django最新バージョン、Django 4.1を紹介します

こんにちは、PyQサポートです。

2022年8月3日にDjango 4.1がリリースされました。
この記事ではDjango 4.1のアップデート内容から、次の項目についてご紹介します。

  • 非同期対応
    • クラスベースViewの非同期対応
    • ORMの非同期インターフェース提供
  • モデルフォームのバリデーションにMeta.constraintsのチェックを追加
  • フォームレンダリングをdivベースに変更するための準備
  • CSRF_COOKIE_MASKED

他にも多くの変更があります。
より詳しく知りたい方はDjango 4.1のリリースノートをお読みください。

Django 4.1 リリースの概要

名称Django
リリースバージョンDjango 4.1
リリース日2022年8月3日
サポートしているPython3.8、3.9、3.10
リリースノートhttps://docs.djangoproject.com/ja/4.1/releases/4.1/

※アップデートの際はBackwards Incompatible Changes(後方互換性のない変更)に十分注意してください

非同期対応

Django 4.1では、以下の非同期対応が行われました。

  • class-based viewsの非同期対応
  • ORMの非同期インターフェース提供

Django 3.0の時点で非同期対応のWebサーバー(ASGIサーバー)で動作するようになり、Django 3.1ではfunction-based viewへの非同期対応が行われました。
しかし、class-based viewsやORMなどは非同期に対応していませんでした。
今回のアップグレードでこれらの非同期対応も行われました。

Django 3.0と3.1での非同期対応については、過去の記事を御覧ください。

blog.pyq.jp

blog.pyq.jp

クラスベースViewの非同期対応

今回は、クラスベースViewでも非同期対応しました。
以下のようにクラスベースViewのメソッド定義に async def を使えるようになりました。(Django 4.1のリリースノートより引用)

import asyncio
from django.http import HttpResponse
from django.views import View

class AsyncView(View):
    async def get(self, request, *args, **kwargs):
        # Perform view logic using await.
        await asyncio.sleep(1)
        return HttpResponse("Hello async world!")

ORMの非同期インターフェース提供

今回の変更で、QuerySetのすべてのデータアクセス操作に対して非同期インターフェースを提供するようになりました。
これらは、既存の同期操作(create(), get()など)に接頭辞 a (acreate(), aget()など)がついています。
新しいインターフェースの実装により、 sync_to_async() でラップせずに非同期コードを実装できるようになりました。

ただし、今回はインターフェースの提供のみで、データベース操作は同期処理のままです。
現在は、新しいメソッド内に sync_to_async() 処理を内包している状態で、非同期データベースドライバーの組込みは現在進行中とのことです。

Djangoの非同期対応の進捗が楽しみですね。

モデルフォームのバリデーションにMeta.constraintsのチェックを追加

これまで、モデルのMetaにconstraintsを設定していてもデータベース上で制限するだけで、フォームでバリデーションするには、フォーム側にバリデーターを実装する必要がありました。
今回の変更で、モデルフォームのバリデーション中にMeta.constraintsのチェックも行われるようになり、制限に反すると ValidationError が起こるようになりました。

Meta.constraintsについては、過去の記事で詳しく紹介しています。

blog.pyq.jp

フォームレンダリングをdivベースに変更するための準備

現在、 {{ form }} で出力されるデフォルトのテンプレートは、tableベースのテンプレートです。
しかし、音声読み上げソフトやその他の支援技術を使用するユーザーのために、今回からdivベースのフォームテンプレートを使用できるようになりました。

新しいテンプレートを使うように推奨されており、Djangoもバージョン5.0からはdivベースのテンプレートをデフォルトで使うことになりました。
その一環として、今回、FormsとFormSetsにテンプレート div.html が追加されました。

また、バージョン5.0までの間に、プロジェクトレベルでデフォルトテンプレートを指定できるように FORM_RENDERER が用意されました。
以下のように設定すると、デフォルトテンプレートが div.html になります。
この FORM_RENDERER は、移行用です。
バージョン5.0で非推奨になり、バージョン6.0で削除される予定です。

FORM_RENDERER = "django.forms.renderers.DjangoDivFormRenderer"

新しい移行用設定 CSRF_COOKIE_MASKED が追加されました。
CsrfViewMiddleware が、CSRF cookieをマスクしなくなりました。

このため、古いDjangoのバージョンを変更なしに4.1にアップデートするためには、 CSRF_COOKIE_MASKED に True を指定する必要があります。
CSRF_COOKIE_MASKED は移行用ですので、バージョン5.0で削除されます。それまでには新しいバージョンに対応する必要があります。

その他の変更

以下のような変更もあります。

  • Form.as_div() が追加され、 <div> を使ったフォームを自動で作れるようになりました
  • PostgreSQL 10のサポートがなくなりました
  • MariaDB 10.2のサポートがなくなりました
  • 組込みの logout view でGETリクエストが非推奨になり、POSTリクエストになりました

他にもいろいろな変更があります。
詳しくは、Django 4.1のリリースノートを参照ください。

まとめ

今回のバージョンアップで、非同期処理への対応が進みました。
また、 {{ form }} で <div> が出力されるようになりました。他にもバージョン5.0へ向けての準備が行われました。

次のリリースも楽しみですね。

Copyright ©2017- BeProud Inc. All rights reserved.