汎用viewを使用しないで自作のカスタムでログインフォームを作り、更に自作のカスタムでパスワード変更フォームを作成し、いざ実際に動かそうとしたらきちんと302リダイレクトで遷移先を指定しているにも関わらず思いもよらぬ場所にリダイレクトされる現象が発生しました。
色々調べてみると、自作のパスワード変更フォームは勝手にログアウトされていたみたいでした。
ということで今回はその勝手にログアウトされてしまう現象の回避方法を紹介します。
コンテンツ
環境
環境は以下になります。ちなみにヒロヤンの場合はpipenvでの環境開発を行っています。
・OS Mac
・python 3.8
・djano 2.2
実際のコード
実際にどのようなコードを書けば良いのか。
想定されるケースは以下のような画面です。
実際のviewsに書くコードは以下になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
from django.contrib.auth import authenticate, login from django.contrib.auth import get_user_model from django.http.response import HttpResponseRedirect from django.core.urlresolvers import reverse User = get_user_model def profile_password_change(request): user = User.objects.get(id=request.user.id) if request.method == 'POST': form = ChangePasswordForm(user.username, request.POST) if form.is_valid(): password = form.cleaned_data['confirm_new_password'] user.set_password(password) user.save() user = authenticate(username=request.user, password=password) login(request, user) return HttpResponseRedirect(reverse('アプリ名:profile_password_change_success')) else: ・・・ |
- 10行目ではログイン中のユーザーと現在のパスワードが一致しているかのバリデーションフォームになりますが割愛します
- 12行目でformからバリデーションで返ってきた生の入力されたパスワードをpassword変数と置きます
- 13行目のset_password()関数に12行目の生のパスワードを与えてハッシュ化させます
- 14行目でuserモデルに保存を実行します。また内部的にログアウト状態になっています
- 15行目でauthenticate()関数で内部的に認証します
- 16行目のlogin()で内部的にログイン状態にします
- 以上が問題なければ18行目でパスワード変更が成功したのでリダイレクトで成功画面に渡します
参考
https://docs.djangoproject.com/ja/2.2/topics/auth/default/
またこちらでは、強制ログアウトを解決しながらのパスワード変更時のformも含めたバリデーションの実装を紹介しています。
スクールを利用して本格的に学ぶ
いかがでしたでしょうか?
10人中9人が挫折すると言われるプログラミングを、ヒロヤンも実はプログラミングスクールで学習をしてきたからで、結果、今はPythonエンジニアとして働いています。
挫折率が高いプログラミングこそお金を払ってメンターを付けて、道を見失わないように環境を構築する必要があるのではないでしょうか。
これはダイエットで自分一人では痩せられないけど、トレーナーを付けて否が応でもせざるを得ない環境を作ると一緒ですね。
ヒロヤンもプログラミング勉強開始直後はあれこれ悩みましたが、悩むよりも手っ取り早くスクールに登録した方が最短ルートで勉強できるのではないかと考え、結果挫折せずに今に至っています。
今なら無料でキャリアカウンセリングを行っているCodeCamp(コードキャンプ)のようなプログラミングスクールもありますのでこれを機会に是非カウンセリングだけでも受けてみてはいかがでしょうか?
上記リンク先から無料相談ができます。
またこちら(↓)ではPython専用のプログラミングスクールをまとめ紹介しています。
コメントを残す