Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

Django 2.0リリース! 最新のDjangoで作るカンバンボードアプリ ~ モデルの定義とDjango REST frameworkの実装

モダンDjango入門 第2回

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2018/03/15 14:00

 2017年12月にバージョン2.0がリリースされたDjango。この連載では最新のDjangoとDjango REST frameworkを用いたプロダクト開発の手法を、実務に使える形でお伝えしていきます。今回はまずDjango 2.0について紹介した後、Djangoのモデルの定義からDjango REST frameworkの導入・実装までを紹介します。

目次

今回の内容

 前回はDjangoの特徴をおさらいしてから、環境構築とDjangoでのプロジェクト構成について解説しました。第2回となる今回は、まず昨年末リリースされたDjango 2.0について見ていきます。Django 2.0の環境へ移行した後、実際のアプリケーション開発を進めながらDjangoのモデルの定義について解説します。そこでは実践的なTipsも合わせて紹介しています。

 そして後半ではRESTful APIを開発するうえで、Django REST frameworkの導入からシリアライザーやルーターといった基本的な実装までを扱っていきます。

Django 2.0

 前回の環境構築において、執筆当時最新であったDjango 1.11.6を使用しました。その後2017年12月に、Django 2.0がリリースされました。本連載のタイトルは『モダンDjango入門』ですので、これ以降はDjangoの2系について解説していきます。まずはDjango 2.0で変更があったポイントと新しく追加された機能を確認してから、Djangoのバージョンアップを行います。

Python 2系のサポート切れ

 Django 2.0での一番大きな変更は、Python 2系のサポートを打ち切ったことです。Django 2.0で動作が保証されているPythonのバージョンは、3.4/3.5/3.6のみとなっています。Python 2/3の互換性を維持するために内部で行われていた処理を削ったことにより、パフォーマンスの向上にもつながっています。

主な新機能

 Django 2.0から加わった主な新機能として、次の3つが挙げられます。

シンプルなURLルーティング構文

 従来の正規表現を用いた書き方に加えて、よりシンプルで読みやすい書き方でURLルーティングが設定できるようになりました。

 これまでのURLルーティングはdjango.conf.urls.url()関数を使って、次のように書いていました。

url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),

 これが今回加わったdjango.urls.path()関数を用いると、以下のように書き換えられます。

path('articles/<int:year>/', views.year_archive),

 正規表現を用いると、柔軟な設定が可能です。しかしその反面、正規表現に慣れていない人にとっては難しく感じられたり、正規表現が必要となる複雑なルーティングが求められるケースは多くないという意見がありました。

 Django 2.0では用途に合わせてURLルーティングの書き方を選べるようになったので、より使いやすいものとなりました。

モバイルフレンドリーなcontrib.admin

 管理サイトがレスポンシブ対応になり、スマートフォンなどでも画面サイズにあわせたレイアウトが表示されるようになりました。

Window関数

 SQLのOVER句が新たに使えるようになりました。

 他にもmanage.py runserverで立ち上がるサーバがHTTP/1.1に対応するなど、細かい新機能や変更点が含まれています。より詳しく知りたい方は、以下のリリースノートをご覧ください。

Django 2.0への移行

 それでは前回作成したプロジェクトのDjangoバージョンをアップグレードしましょう。

 仮想環境をactivateしてから、pipコマンドでDjangoのアップグレードを行います。

$ source env/bin/activate
(env) $ pip install -U Django
Collecting Django
  Downloading Django-2.0.2-py3-none-any.whl (7.1MB)
    100% |████████████████████████████████| 7.1MB 218kB/s
Requirement already up-to-date: pytz in ./env/lib/python3.6/site-packages (from Django)
Installing collected packages: Django
  Found existing installation: Django 1.11.6
    Uninstalling Django-1.11.6:
      Successfully uninstalled Django-1.11.6
Successfully installed Django-2.0.2

 執筆時最新のバージョンである2.0.2がインストールされました。合わせて前回インストールしたdjango-extensionsもDjango 2.0に対応したバージョンがリリースされているのでアップグレードしておきましょう。

(env) $ pip install -U django-extensions
...
Successfully installed django-extensions-1.9.9 typing-3.6.4

 requirements配下のbase.txtlocal.txtも忘れずに更新しておきます。

 それではさっそく、manage.py runserverコマンドで開発サーバを起動させましょう。

(env) $ python manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).

You have 1 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): auth.
Run 'python manage.py migrate' to apply them.

January 27, 2018 - 08:05:30
Django version 2.0.2, using settings 'config.settings.local'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

 ブラウザからhttp://127.0.0.1:8000/にアクセスすると、Django 2.0で新しくデザインされた次の画面が表示されます。

Djangoの初期画面
Djangoの初期画面

 次にhttp://127.0.0.1:8000/adminにログインして、管理サイトも確認してみましょう。Chrome DevToolsなどを使ってモバイル端末のシミュレートを行うと、管理サイトがレスポンシブ対応になったことがわかります。

レスポンシブ対応の管理サイト
レスポンシブ対応の管理サイト

 またmanage.py runserverを実行した際に、適用されていないマイグレーションが1つあるというメッセージが表示されていました。このマイグレーションは、Django 2.0でAbstractUser.last_nameのmax_lengthが30文字から150文字に変わったためです。manage.py migrateコマンドでマイグレーションを実行しておきましょう。

(env) $ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying auth.0009_alter_user_last_name_max_length... OK

 最後にconfig/urls.pyを編集して、新しいURLルーティング構文を使うようにしましょう。

from django.contrib import admin
from django.urls import path

urlpatterns = [
    path('admin/', admin.site.urls),
]

 幸い環境構築までしか行っていなかったので、今回は何の心配もなくDjango 2.0へ移行できました。しかし実際に運用中のDjangoアプリケーションではそうはいきません。後方互換性のない変更によって、アプリケーションが動かなくなる可能性があります。

 安全なアップグレードのために、Djangoでは非推奨な機能を使っていないかどうかチェックできるようになっています。python -Wd manage.pyとオプション付きで実行することで、デフォルトでは非表示となっている警告を検知できます。Django 2.0から使えなくなる機能を使用している場合には、RemovedInDjango20Warningという警告が表示されます。Django 1.11の環境でこのRemovedInDjango20Warningを解消してから、2.0へのアップグレードを行うことをお勧めします。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 新井 正貴(アライ マサタカ)

     東京大学文学部卒業、アライドアーキテクツ株式会社にて勤務。2016年4月、株式会社SQUEEZEに入社。コミュニティ活動として、PyCon JP 2015〜 スタッフ、Pythonもくもく会の主催を行う。趣味はラクロスとPerfume。 Site:http://massa14...

バックナンバー

連載:モダンDjango入門
All contents copyright © 2005-2018 Shoeisha Co., Ltd. All rights reserved. ver.1.5