はじめに
作成したDjangoアプリをAWS EC2(Ubuntu16.04)にデプロイする過程で、以下のエラーに遭遇したため対処法を書き残します。
エラーの内容
Ubuntu内でDjangoプロジェクトをgit clone
した後、python3 manage.py makemigrations
を実行したところ、
TypeError: resolve() got an unexpected keyword argument 'strict'
というエラーが表示されました。
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve(strict=True).parent.parent
の1文がエラーとなっているようです。
これはDjangoのmanage.pyがある基本ディレクトリの絶対パスを取得する記述です。
ここについては特にいじった記憶がないためなんでだろうと思いググると、Django3.1以降とその前でこの部分の記述が変わっていることがわかりました。
今回ローカルではPython3.8+Django3.1で開発していましたが、確認したところUbuntuにはPython3.5+Django2.2がインストールされており、どうやらバージョンの違いによるエラーのようです。
resolveメソッドのstrict引数はpython3.6以降で追加されたようなので、ここが根本の原因でしょう。
解決方法
本来であればUbuntu内のDjangoのバージョンに合わせて開発する必要がありますが、今回はデプロイできるか簡単に試したかっただけなので、settings.pyをDjango2.2に合わせた記述に変えてあげます。
# こちらはDjango3.1以降
# from pathlib import Path
# BASE_DIR = Path(__file__).resolve(strict=True).parent.parent
# 従来の記述
import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
こうすることで無事エラーは解消され、migrationが成功しました。
言語やフレームワークのバージョン管理は開発において特に重要なことだと思うので今後は十分に気を付けていきたいと思います。