こんにちは、PyQサポートです。
2022年8月3日にDjango 4.1がリリースされました。
この記事ではDjango 4.1のアップデート内容から、次の項目についてご紹介します。
- 非同期対応
- クラスベースViewの非同期対応
- ORMの非同期インターフェース提供
- モデルフォームのバリデーションにMeta.constraintsのチェックを追加
- フォームレンダリングをdivベースに変更するための準備
- CSRF_COOKIE_MASKED
他にも多くの変更があります。
より詳しく知りたい方はDjango 4.1のリリースノートをお読みください。
- Django 4.1 リリースの概要
- 非同期対応
- モデルフォームのバリデーションにMeta.constraintsのチェックを追加
- フォームレンダリングをdivベースに変更するための準備
- CSRF_COOKIE_MASKED
- その他の変更
- まとめ
Django 4.1 リリースの概要
名称 | Django |
---|---|
リリースバージョン | Django 4.1 |
リリース日 | 2022年8月3日 |
サポートしているPython | 3.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での非同期対応については、過去の記事を御覧ください。
クラスベース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については、過去の記事で詳しく紹介しています。
フォームレンダリングを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
新しい移行用設定 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へ向けての準備が行われました。
次のリリースも楽しみですね。