頭の中は異空間

ものづくり中心

【Django】何もしてないのに急にコードが動かなくなったらバージョンを疑えという話

Djangoでログイン、ログアウトを実装中のあるとき、logoutを読み込もうとするともうないのでエラーが返されるようになりました。なんでじゃ。

    from django.contrib.auth.views import logout, LoginView
ImportError: cannot import name 'logout'

それまで正常動作していたのが急に落ちるなんてありません、が直近で何かしたかなと思い返すとselect2をpip installしただけなのですがそれによってDjangoのバージョンまで勝手にアップグレードされてました。
f:id:notwo:20190920083640p:plain
(Collecting django >= 2.0のあたり)
こんな感じのログが出てました。よく見ると、たしかに既存の古いDjangoがアンスコ&要件を満たす新バージョンのDjangoがインストールされているじゃあーりませんかー。この機能、便利っちゃ便利です、しかし結果的にDjango1系で動作していたコードが2系で動かなくなってしまいました。

私の手元の環境のDjangoのバージョンが1.11.1→2.2.5となっていたせいで、1系で使えたlogoutを読み込めなくなっていたのが原因だったわけですが、これpipの仕様を知らないと結構引っかかりやすい罠じゃないかなあと思います。知らないほうが悪い、となりそうですが。

Djangoは1系と2系で一部書き方が違うことがあるので、他のサイトを参考にするときも、Djangoのバージョンが何かを絶対に見るようにしよう、ということになります。まぁこれはDjangoに限った話ではないですね。