環境情報
- Python...3.8.13
- Django...3.2
- Django REST Framework.. 3.2.0(※注目)
- 認証方式... Cookie認証
実行失敗したコマンド
# マイレーションファイルを生成
python manage.py makemigrations shop
出力エラーの一部
File "/Users/ユーザー名/python-projects/drf_vue_cookie_auth/config/urls.py", line 23, in <module>
path('api-auth/', include('rest_framework.urls')),
File "/Users/ユーザー名/opt/anaconda3/envs/djangoenv/lib/python3.8/site-packages/rest_framework/urls.py", line 23, in <module>
url(r'^login/$', views.login, template_name, name='login'),
AttributeError: module 'django.contrib.auth.views' has no attribute 'login'
マイグレーションファイル関連のエラーというより別の箇所のAttributeErrorが原因のエラーのよう。
特に最終行のエラー文が気になったので、下のようにPyCharmで遡って該当のdjango.contrib.auth.viewsを見てみたが、確かに'login'なんてフィールドもメソッドも無かったので変だと思った。
その'login'を読もうとしているのが、site-packages/rest_framework/配下のurls.pyだが
url(r'^login/$', views.login, template_name, name='login'),
エラー文にも書いてあるこの部分がおかしいような気がしてきた。
「でもライブラリのコードじゃん。一体なぜ? というか、こんなの自分で直せないしどうしようか。」
という事で自分でよく考えた結果、以下の対応を試してみた。
行った対応(解決策)
pip install -U djangorestframework
上記コマンドでdjangorestframeworkのパッケージ更新を行ってみたところ、rest_framework/urls.pyが更新され以下のようになった。
- url(r'^login/$', views.login, template_name, name='login'),
+ path('login/', views.LoginView.as_view(template_name='rest_framework/login.html'), name='login'),
エラー文のurl(r'^login/$', views.login, template_name, name='login')
なんて記述は無くなり、これが正しいの姿のようだ。
対処を考える中でなんとなく予想したが、古いライブラリのコードを取得していた模様。
その原因がどうしても気になり、historyでコマンド履歴を見てみたら過去にこんなコマンドを発見。
pip install djangorestframework=3.2
おそらくDjangoのLTSのバージョン(3.2)と混同して、Django REST Frameworkを同じようにしたら古いバージョンになってしまったと... ちなみにDRFの最新は3.13.X系。 DRFで3.2となると2015年のものになるようです(笑)
(参考: https://www.django-rest-framework.org/community/release-notes/)
DRFのバージョンちゃんと元に戻したところで実行失敗したマイグレーションコマンドを再度打ったら無事に成功しました。
些細なミスだけど、Django初学者を脱するための一歩になるといいな。