Python学習チャンネル by PyQ

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

Django 3.0について紹介します

f:id:kenken0326:20191219152802p:plain

id:hirokikyです。

Django3.0がリリースされました!

Django3.0で追加される機能、変更点についてご存知ですか?
今回はDjango3.0について紹介します。

すべての機能や変更を細かく紹介すると長くなるので、「Django3.0で大まかに何が変わったのか?」をご説明します。
他にも、いくつか気になる機能をピックアップしていますが、より詳しく知りたい人は Django3.0リリースノート を読んでください。

※追記:2020年8月4日にDjango最新バージョン「Django 3.1」がリリースされました。こちらについても本ブログで解説しております。

blog.pyq.jp

リリースの概要

名称Django
リリースバージョンDjango 3.0
開始日December 2, 2019
サポートしているPython3.6、3.7、3.8
ドキュメントURLhttps://docs.djangoproject.com/en/3.0/releases/3.0/

Django3.0に限らない話ですが、アップデートの際はBackwords Incompatible Changes(後方互換性のない変更)に十分注意してください。

ASGI(非同期Webサーバー)対応

Django3.0は非同期対応のWebサーバー(ASGIサーバー)で動作するようになりました。
ASGIサーバーは非同期処理に対応したWebアプリケーションを動作させるための、Python製のWebサーバーです。

ただし、Django3.0ではViewやMiddleware、Modelは非同期に対応していません。
本格的な非同期対応は今後のリリースで実装される予定です。

Django3.0リリース情報は公式ドキュメントのこちらのページに記載されています

docs.djangoproject.com

今後どうなるか

今後、Djangoが非同期を完全にサポートすれば、たとえば以下のようなWebアプリケーションをDjangoでも作れると期待されています。

  • WebSocketのような非同期・双方向のプロトコルに対応したアプリケーション
  • データベースアクセスでブロックしないアプリケーション

現状では「Django3.0がASGI対応をした」という事実だけで、私たちが普段作るDjangoアプリケーション的に大きな変化はありません。
これからの非同期対応に向けて準備を整えたというところでしょうか。今後のDjangoのリリースが楽しみです。

Python2向けの機能削除

Python2向けに提供されていた互換性用の機能がDjango3.0からは削除されています。 もともとDjango2系からPython2のサポートはありませんが、過去から残されていたPython2向けの機能が削除されます。
削除された機能のうち、以下の2つは比較的よく使われていた機能だと思います。

  • django.utils.six
  • django.utils.lru_cache.lru_cache

個人的には utils.six がなくなったことは感動的です。

これはDjangoがPython3対応をするときにsixというライブラリーをDjango内部に取り込んだものです。 外部ライブラリーとの依存を避けるために取られた方法ですが、あまり美しくないので、この機会になくなって良かったと思っています。

サードパーティー製のDjangoアプリでもPython2をサポートしないものが増えていくでしょう (Python2対応しているDjango1.11も、2020年4月にサポート切れになります)。

2020年でPython2のサポートが切れるというのもあって、また1つ大きな時代の変化を感じます。

Python2向けの機能削除については公式ドキュメントのこちらのページに記載されています

docs.djangoproject.com

choicesを便利に扱うEnumeration typesが追加

Djangoのモデルで「項目からの選択」を指定できる choices を便利に使えるEnumeration typesという機能が追加されました。

class UserProfile(models.Model):

    class Job(models.TextChoices):
        STUDENT = "ST", "学生"
        WORKER = "WO", "会社員"
        OFFICER = "OF", "会社役員"
        
    job = models.CharField("職種", max_length=2, choices=Job.choices)

job の選択肢 choices= をまとめてキレイに書けるのが利点です。

この機能がないDjango2以前は、以下のように値を書く必要がありました。

class UserProfile(models.Model):

    JOB_STUDENT = "ST"
    JOB_WORKER = "WO"
    JOB_OFFICER = "OF"
    JOB_CHOICES = (
        (JOB_STUDENT, "学生"),
        (JOB_WORKER, "会社員"),
        (JOB_OFFICER, "会社役員"),
    )

    job = models.CharField("職種", max_length=2, choices=JOB_CHOICES)

他にも数値や日付を値にしたり、便利に使えそうです。
あまり大きな機能ではありませんが、Djangoでのアプリ開発をよくする人には嬉しい機能ではないでしょうか。

Enumeration typesについては公式ドキュメントのこちらのページに記載されています

docs.djangoproject.com

他には?

他にもMariaDBの正式対応や、PostgreSQL向けの便利な機能の追加、QuerySetの機能追加などがあります。
ぜひ気になる方は下記のリリースノートから変更点を見てみてください。

docs.djangoproject.com

Django3.0にはいつ上げるべき?

Django2.2までアップグレードしていて、頻繁にアップグレードできるプロジェクトであればDjango3.0にしても良いでしょう。 Django2.2で DeprecationWarning をすべて削除した状態にしてからアップグレードしましょう。

大規模なプロジェクトでアップグレードを頻繁にしたくない場合は、Django3.2 LTSを待つのもありです。 Django3系のLTであるDjango3.2は2021年の4月にリリース予定ですので、そこまではDjango2.2で待てます(Django2.2は2022年4月までのサポートです)。 Django2系のプロジェクトでも、今のうちにDeprecationWarnigを取り除いておくと今後のアップグレードの時期にスムーズにいきそうですね。

ロードマップはこちらをご覧ください。

www.djangoproject.com

まとめ

Django3.0はDjango3系で初めてになる、記念すべきリリースです。
Djangoで非同期処理が本格的にサポートされていくのはこれからですが、今後のDjangoに期待が高まるリリースです。

DjangoCongressJP 2020 の開催も決まり、ますます盛り上がりを見せるDjangoです。
今後もDjangoの進化と、Python、Djangoコミュニティの成長が楽しみです!

DjangoについてはPyQでも学習できますので、ぜひこの機会にWebアプリの開発スキルを身につけませんか?

pyq.jp

Copyright ©2017-2020 BeProud Inc. All rights reserved.