ユーザーログイン機能をdjangoプロジェクトに実装する/ユーザー認証の仕組み
ユーザーログイン機能をdjangoプロジェクトに実装する
- 最初に主要ファイルにどのように書けばユーザーログイン実現するかを書く
- 次にユーザー認証の仕組みを書く
ユーザーログイン実現の書き方
編集ファイルはこれらになる。forms.py
views.py
urls.py
login_page.html
イメージはforms.pyにて入力フォームを規定して、それをviews.pyにcontextという形で反映させる。views.pyとlogin_page.htmlの関係性は普段と同じ通り。urls.pyも得に変わった処理もなくいつもどおりの書き方で良し。
forms.py
from django import forms class LoginForm(forms.Form): username = forms.CharField() password = forms.CharField(widget=forms.PasswordInput)
はっきりしていないのはPasswordInputはTextInputとどう違うのか?
html上の仕組みから考えれば、ブラウザ上でパスワード入力時に文字隠しになる可能性が高い。
検証後この件については更新したい。
views.py
from .forms import LoginForm from django.shortcuts import render,redirect from django.contrib.auth import login, def login_page(request): form = LoginForm() context = {"form" : form, } if form.is_valid(): username = form.cleaned_data.get("username") password = form.cleaned_data.get("password") user = authenticate(username =username, password = password ) if user is not None: login(request, user) redirect("home_page.html") else: print(error) return render(request, "login/page.html", context )
ユーザー認証の仕組みを書く
仕組みの肝であるauthenticateはなぜ必要なのか?
''認証情報のセットを検証するには authenticate() を利用してください。このメソッドは認証情報をキーワード引数として受け取ります。検証する対象はデフォルトでは username と password であり、その組み合わせを個々の 認証バックエンド に対して問い合わせ、認証バックエンドで認証情報が有効とされれば User オブジェクトを返します。もしいずれの認証バックエンドでも認証情報が有効と判定されなければ PermissionDenied が送出され、None が返されます。以下は実装例です:
from django.contrib.auth import authenticate user = authenticate(username='john', password='secret') if user is not None: # A backend authenticated the credentials else: # No backend authenticated the credentials #django ドキュメントより
ドキュメントは、usernameとpasswordをauthenticate()に渡してくれれば、ログイン可能な(認証された)userを吐き出してくれるってこと。
それは重要なlogin()の引数の1要素。login()は下のようにに使う。
login( request, user)
目的はログインすること。
そのためにはlogin(request, user)を実行する。
そしてその引数であるuserが必要。
このuserを作り出すのがauthenticate()。
authenticate()の引数はusername=フォームに入力されたusernameの値(value)とpassword=フォームに入力されたpasswordの値(value)
formに入力された値を取り出すのはis_valid(), cleaned_dataを用いる。
これらの相互関係がポイント。
コードはこの論理の逆に書いていけばログインが成立する。