Django のバージョンを 1.8 から 2.1 にアップグレードした話
2019/01/12 22:39
  • このサイトですが、実は開発を開始した 2016 年 4 月頃から Django のバージョンアップをしていませんでした。
    2016 年 5 月 30 日にリリースして以降、 Django のバージョンはどんどん上がり
    ついにはメジャーバージョンアップまで果たされてしまいました 😗

    2 系になってからは管理サイトの UI も意識高い系になっているようだし、さすがにまずいと
    思ったので意を決してアップグレードしました 👍

    落とし穴にひとつひとつはまっていったのでエラーログとともにオペレーションの記録を公開します(恥さらし 🙈

    各種ライブラリのアップグレード

    pip のアップグレード

    $ pip install --upgrade pip
    Collecting pip
      Downloading https://files.pythonhosted.org/packages/c2/d7/90f34cb0d83a6c5631cf71dfe64cc1054598c843a92b400e55675cc2ac37/pip-18.1-py2.py3-none-any.whl (1.3MB)
        100% |████████████████████████████████| 1.3MB 661kB/s 
    Installing collected packages: pip
      Found existing installation: pip 9.0.1
        Uninstalling pip-9.0.1:
          Successfully uninstalled pip-9.0.1
    Successfully installed pip-18.1
    


    django のアップグレード

    $ pip install --upgrade django
    Collecting django
      Downloading https://files.pythonhosted.org/packages/fd/9a/0c028ea0fe4f5803dda1a7afabeed958d0c8b79b0fe762ffbf728db3b90d/Django-2.1.4-py3-none-any.whl (7.3MB)
        100% |████████████████████████████████| 7.3MB 2.5MB/s 
    Requirement already satisfied, skipping upgrade: pytz in /home/photo/.pyenv/versions/3.5.1/lib/python3.5/site-packages (from django) (2017.3)
    Installing collected packages: django
      Found existing installation: Django 1.8
        Uninstalling Django-1.8:
          Successfully uninstalled Django-1.8
    Successfully installed django-2.1.4
    


    django-rest-framework のアップグレード

    $ pip install --upgrade djangorestframework
    Collecting djangorestframework
      Downloading https://files.pythonhosted.org/packages/99/0b/d37a5a96c5d301e23adcabcc2f3fa659fb34e6308590f95ebb50cdbe98a1/djangorestframework-3.9.0-py2.py3-none-any.whl (924kB)
        100% |████████████████████████████████| 931kB 7.4MB/s 
    Installing collected packages: djangorestframework
      Found existing installation: djangorestframework 3.5.3
        Uninstalling djangorestframework-3.5.3:
          Successfully uninstalled djangorestframework-3.5.3
    Successfully installed djangorestframework-3.9.0
    

    django-debug-toolbar のアップグレード

    $ pip install --upgrade django-debug-toolbar
    Collecting django-debug-toolbar
      Downloading https://files.pythonhosted.org/packages/01/9a/3db232bd15882d90d3c53de1f34ce0a522327849593c9198899713267cfe/django_debug_toolbar-1.11-py2.py3-none-any.whl (201kB)
        100% |████████████████████████████████| 204kB 9.6MB/s 
    Requirement already satisfied, skipping upgrade: sqlparse>=0.2.0 in /home/photo/.pyenv/versions/3.5.1/lib/python3.5/site-packages (from django-debug-toolbar) (0.2.4)
    Requirement already satisfied, skipping upgrade: Django>=1.11 in /home/photo/.pyenv/versions/3.5.1/lib/python3.5/site-packages (from django-debug-toolbar) (2.1.4)
    Requirement already satisfied, skipping upgrade: pytz in /home/photo/.pyenv/versions/3.5.1/lib/python3.5/site-packages (from Django>=1.11->django-debug-toolbar) (2017.3)
    Installing collected packages: django-debug-toolbar
      Found existing installation: django-debug-toolbar 1.9.1
        Uninstalling django-debug-toolbar-1.9.1:
          Successfully uninstalled django-debug-toolbar-1.9.1
    Successfully installed django-debug-toolbar-1.11
    

    プロジェクトのコードを Django 2.1 仕様にする

    続いて、ソースコードを改修します。
    いくつかの記述は Django 2.1 では対応しておらずエラーとなりました。

    reverse

    # Django 1.8
    from django.core.urlresolvers import reverse
    
    # Django 2.1
    from django.urls import reverse
    

    参考サイト: ImportError: 'django.core.urlresolvers'という名前のモジュールがありません

    admin の include を外す

    # Django 1.8
    urlpatterns = [
        url(r'^admin/', include(admin.site.urls)),
    ]
    
    # Django 2.1
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
    ]
    

    参考サイト: Django Deprecation Warning or ImproperlyConfigured error - Passing a 3-tuple to django.conf.urls.include() is not supported

    Django の on_delete
    外部キーを指定してる箇所に on_delete 属性が必須になったようです。

    TypeError: __init__() missing 1 required positional argument: 'on_delete'

    プロジェクトの models.py と実行済みの migration ファイルの両方を変更する必要があります。( migrations の方は忘れがち😅)
    参考: Django2.0から必須になったon_deleteの使い方
    参考: Is it correct to modify old migration files in Django?

    migration を実行する

    $ ./manage.py migrate
    Operations to perform:
      Apply all migrations: admin, auth, contenttypes, sessions, sites
    Running migrations:
      Applying admin.0002_logentry_remove_auto_add... OK
      Applying admin.0003_logentry_add_action_flag_choices... OK
      Applying auth.0007_alter_validators_add_error_messages... OK
      Applying auth.0008_alter_user_username_max_length... OK
      Applying auth.0009_alter_user_last_name_max_length... OK
      Applying sites.0002_alter_domain_unique... OK
    


    middleware の設定
    MIDDLEWARE_CLASSESMIDDLEWARE に変更し、 'django.contrib.auth.middleware.SessionAuthenticationMiddleware' を削除します。

    MIDDLEWARE = (
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
        'django.middleware.security.SecurityMiddleware',
        'htmlmin.middleware.HtmlMinifyMiddleware',
        'htmlmin.middleware.MarkRequestMiddleware',
        'django.middleware.cache.UpdateCacheMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.cache.FetchFromCacheMiddleware',
    )
    

    参考: Django 1.9 から 2.1 に上げる時の備忘録

    が、 MIDDLEWARE まわりでエラーが出る

    django.core.management.base.SystemCheckError: SystemCheckError: System check identified some issues:

    ERRORS:
    ?: debug_toolbar.middleware.DebugToolbarMiddleware is missing from MIDDLEWARE.
    HINT: Add debug_toolbar.middleware.DebugToolbarMiddleware to MIDDLEWARE.


    どうやらデバッグツールも MIDDLEWARE に入れる必要があるらしいので最終的に下記の通りにした。
    MIDDLEWARE = (
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
        'django.middleware.security.SecurityMiddleware',
        'htmlmin.middleware.HtmlMinifyMiddleware',
        'htmlmin.middleware.MarkRequestMiddleware',
        'django.middleware.cache.UpdateCacheMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.cache.FetchFromCacheMiddleware',
        'debug_toolbar.middleware.DebugToolbarMiddleware',
    )
    

    参考: django-debug-toolbar の導入手順メモ


    PyJade への対応

    いつの間にか PyJade が死亡していました 😇
    module 'django.utils.translation.trans_real' has no attribute 'templatize'

    Incompatibility with Django 1.11

    Use pypugjs instead!


    はい…PyPugJS なるものを使います。(ていうか PyJade の完璧な後継ですが。)
    ↓ github はこちら
    https://github.com/kakulukia/pypugjs

    というわけで pypugjs をインストールする

    $ pip install --upgrade pypugjs
    Collecting pypugjs
      Downloading https://files.pythonhosted.org/packages/ce/b9/38ce119d4b143d46713eb0138dd5fcb8723082420dc56b200accc6224065/pypugjs-5.7.2-py2.py3-none-any.whl
    Requirement already satisfied, skipping upgrade: six in /home/photo/.pyenv/versions/3.5.1/lib/python3.5/site-packages (from pypugjs) (1.10.0)
    Collecting chardet (from pypugjs)
      Downloading https://files.pythonhosted.org/packages/bc/a9/01ffebfb562e4274b6487b4bb1ddec7ca55ec7510b22e4c51f14098443b8/chardet-3.0.4-py2.py3-none-any.whl (133kB)
        100% |████████████████████████████████| 143kB 10.2MB/s 
    Installing collected packages: chardet, pypugjs
    Successfully installed chardet-3.0.4 pypugjs-5.7.2
    

    ※どういうわけか何も考えずに --upgrade つけてしまっていました🙈
    また、拡張テンプレート内から別の拡張テンプレートを呼び出そうとするとエラーになってしまったので
    こちらはべた書きで対応しました。(原因不明)

    静的ファイルの生成

    Django 2.0 から管理サイトの UI が、1 系の「レガシーさを隠そうともしなかった UI 」から「それなりにイケてる今っぽい UI」になっています。
    というわけで collectstatic しておきます。
    $ ./manage.py collectstatic
    
    You have requested to collect static files at the destination
    location as specified in your settings:
    
        /path/to/project/static
    
    This will overwrite existing files!
    Are you sure you want to do this?
    
    Type 'yes' to continue, or 'no' to cancel: yes
    
    169 static files copied to '/path/to/project/static', 47 unmodified.
    


    番外編( SQLite )への対応

    最後に、 SQLite への対応へも言及しておきます。

    django.db.utils.NotSupportedError: URIs not supported

    Django 2.1 環境で ./manage.py migrate すると上記のエラーがでました。


    Django 2.1 は SQLite version 3.7.15 以上しかサポートしない
    参考: SQLite notes


    まさかと思ってバージョンをチェックすると、無情にも 3.6.20 でした 😇

    $ sqlite3 --version
    3.6.20
    


    CentOS 6 に SQLite 3.7.15 以上をインストールする

    CentOS あるあるですが、パッケージのアップグレードが亀です🐢
    なので先の 3.6.20 が最新だと言われてしまったので、リポジトリを追加してインストールすることにしました。

    $ cd /usr/local/src
    $ sudo wget https://forensics.cert.org/cert-forensics-tools-release-el6.rpm
    --2019-01-01 17:01:20--  https://forensics.cert.org/cert-forensics-tools-release-el6.rpm
    forensics.cert.org をDNSに問いあわせています... 192.88.209.7
    forensics.cert.org|192.88.209.7|:443 に接続しています... 接続しました。
    HTTP による接続要求を送信しました、応答を待っています... 200 OK
    長さ: 11964 (12K) [application/x-rpm]
    `cert-forensics-tools-release-el6.rpm' に保存中
    
    100%[======================================================================================================================>] 11,964      --.-K/s 時間 0s      
    
    2019-01-01 17:01:22 (108 MB/s) - `cert-forensics-tools-release-el6.rpm' へ保存完了 [11964/11964]
    
    $ sudo rpm -Uvh cert-forensics-tools-release*rpm
    警告: cert-forensics-tools-release-el6.rpm: ヘッダ V4 RSA/SHA1 Signature, key ID 87e360b8: NOKEY
    準備中...                ########################################### [100%]
       1:cert-forensics-tools-re########################################### [100%]
    
    
    $ sudo  yum --enablerepo=forensics install sqlite
    読み込んだプラグイン:fastestmirror, security
    インストール処理の設定をしています
    Loading mirror speeds from cached hostfile
     * base: ftp.iij.ad.jp
     * epel: ftp.riken.jp
     * extras: ftp.iij.ad.jp
     * remi-safe: ftp.riken.jp
     * updates: ftp.iij.ad.jp
    forensics                                                                                                                                | 2.9 kB     00:00     
    forensics/primary_db                                                                                                                     | 923 kB     00:01     
    forensics-splunk                                                                                                                         | 2.9 kB     00:00     
    forensics-splunk/primary_db                                                                                                              |  14 kB     00:00     
    依存性の解決をしています
    --> トランザクションの確認を実行しています。
    ---> Package sqlite.x86_64 0:3.6.20-1.el6_7.2 will be 更新
    --> 依存性の処理をしています: sqlite = 3.6.20-1.el6_7.2 のパッケージ: sqlite-devel-3.6.20-1.el6_7.2.x86_64
    ---> Package sqlite.x86_64 0:3.7.17-4.el6 will be an update
    --> トランザクションの確認を実行しています。
    ---> Package sqlite-devel.x86_64 0:3.6.20-1.el6_7.2 will be 更新
    ---> Package sqlite-devel.x86_64 0:3.7.17-4.el6 will be an update
    --> 依存性解決を終了しました。
    
    依存性を解決しました
    
    ================================================================================================================================================================
     パッケージ                              アーキテクチャ                    バージョン                                リポジトリー                          容量
    ================================================================================================================================================================
    更新:
     sqlite                                  x86_64                            3.7.17-4.el6                              forensics                            373 k
    依存性関連での更新をします。:
     sqlite-devel                            x86_64                            3.7.17-4.el6                              forensics                            104 k
    
    トランザクションの要約
    ================================================================================================================================================================
    アップグレード       2 パッケージ
    
    総ダウンロード容量: 477 k
    これでいいですか? [y/N]y
    パッケージをダウンロードしています:
    (1/2): sqlite-3.7.17-4.el6.x86_64.rpm                                                                                                    | 373 kB     00:00     
    (2/2): sqlite-devel-3.7.17-4.el6.x86_64.rpm                                                                                              | 104 kB     00:00     
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------
    合計                                                                                                                             10 kB/s | 477 kB     00:47     
    警告: rpmts_HdrFromFdno: ヘッダ V4 RSA/SHA1 Signature, key ID 87e360b8: NOKEY
    Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-cert-forensics-2018-04-07
    Importing GPG key 0x87E360B8:
     Userid : CERT Forensics Operations and Investivations Team <forensics@cert.org>
     Package: cert-forensics-tools-release-6-13.noarch (installed)
     From   : /etc/pki/rpm-gpg/RPM-GPG-KEY-cert-forensics-2018-04-07
    これでいいですか? [y/N]y
    rpm_check_debug を実行しています
    トランザクションのテストを実行しています
    トランザクションのテストを成功しました
    トランザクションを実行しています
    警告: RPMDB は yum 以外で変更されました。
      更新                    : sqlite-3.7.17-4.el6.x86_64                                                                                                      1/4 
      更新                    : sqlite-devel-3.7.17-4.el6.x86_64                                                                                                2/4 
      整理中                  : sqlite-devel-3.6.20-1.el6_7.2.x86_64                                                                                            3/4 
      整理中                  : sqlite-3.6.20-1.el6_7.2.x86_64                                                                                                  4/4 
      Verifying               : sqlite-3.7.17-4.el6.x86_64                                                                                                      1/4 
      Verifying               : sqlite-devel-3.7.17-4.el6.x86_64                                                                                                2/4 
      Verifying               : sqlite-devel-3.6.20-1.el6_7.2.x86_64                                                                                            3/4 
      Verifying               : sqlite-3.6.20-1.el6_7.2.x86_64                                                                                                  4/4 
    
    更新:
      sqlite.x86_64 0:3.7.17-4.el6                                                                                                                                  
    
    依存性を更新しました:
      sqlite-devel.x86_64 0:3.7.17-4.el6                                                                                                                            
    
    完了しました!
    
    
    $ sqlite3 --version
    3.7.17 2013-05-20 00:56:22 118a3b35693b134d56ebd780123b7fd6f1497668
    


    migrate する

    $ ./manage.py migrate
    Operations to perform:
      Apply all migrations: admin, app, auth, contenttypes, sessions
    Running migrations:
      Applying admin.0002_logentry_remove_auto_add... OK
      Applying admin.0003_logentry_add_action_flag_choices... OK
      Applying auth.0007_alter_validators_add_error_messages... OK
      Applying auth.0008_alter_user_username_max_length... OK
      Applying auth.0009_alter_user_last_name_max_length... OK
    


    以上でうまくいきました。

    人気ブログランキングへ ブログランキング・にほんブログ村へ
    ↑応援よろしくお願いします!m(_ _)m

  • <2019/01/12 22:39>
  • Python
  • Djangoバージョンアップ2.1pipupgradePythonPyJadeJadePugpypugjs
  • 新しい記事へ
    [Windows] PIXTA クリエイター向けの ZIP 圧縮スクリプトを勢いで作ったメモ(Adobe Stock にも対応!)

    古い記事へ
    [2018-2019] 年末年始の成果発表

profile picture

自己紹介的な何か

@wkmettyでついったーやってます。時々。 6年間勤めたゲーム会社を2018年2月に退職しフリーランスのプログラマに。 WordPress Core, WP-CLI コントリビューター。 お仕事募集中です。