Shinです。
前回のサインインの続きから説明していきます。
今回はDjangoにおけるログイン実装方法についてです。
サインインのやり方とほぼ同じなので難しく考えなくてOKです。
参考文献:Djangoのログイン認証
views.pyにおけるログイン実装コードから
まずは実際にログインするためのコードをみていきましょう。
(views.py)
from django.contrib.auth import authenticate, login
def loginview(request):
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
# もし、ユーザーオブジェクトが存在するなら。
if user is not None:
# ログインする。
login(request, user)
return redirect('public.html')
# ユーザーがオブジェクトが存在しないなら。
else:
return render(request, 'login.html', {'error': 'そのユーザーは存在しません。'})
return render(request, 'login.html', {})
遷移先の「public.html」はtemplatesディレクトリの中に生成しています。これは各々好きな遷移先(htmlファイル)を作ってください。
サインインの記事では説明しなかった部分を中心に解説します。
user = authenticate(username=username, password=password)
authenticateメソッドを使用します。
引数にはusernameとpasswordを指定。上記2行で書いたusernameとpasswordが設定されています。
返されるものは、もしユーザーが存在するならばUserオブジェクトが。もし照合しなければNoneが返されます。
返されたオブジェクトはuser変数の中へ格納。その後のifの条件分岐で利用します。
詳しくはこちらのリファレンスをご覧ください。
if user is not None:
user変数の中身が「None」でなければ、つまりuser変数の中にUserオブジェクトが入っているなら。という意味になります。
Userオブジェクトの中身の情報はログインのフォームで打ち込んだusernameとpasswordが格納されています。
login(request, user)
return redirect(‘public.html’)
login()メソッド使ってログインしましょう。
受け取る引数はHTTPリクエストオブジェクトと、Userオブジェクトです。この受け取った情報をもとにログインをします。
ログインしたら遷移したいページにリダイレクトさせましょう。
コラム:authenticateの中身(認証バックエンド)を覗いてみよう
Django公式リファレンスに載せてあったauthenticateの中身を見てみましょう。
from django.conf import settings
from django.contrib.auth.backends import BaseBackend
from django.contrib.auth.hashers import check_password
from django.contrib.auth.models import User
class SettingsBackEnd(BaseBackend):
def authenticate(self, request, usename=None, password=None):
login_vaild = (settings.ADMIN_LOGIN == username)
pwd_vaild = check_password(password, settings.ADMIN_PASSWORD)
if login_vaild and pwd_vaild:
try:
user = User.object.get(username=username)
except User.DoesNotExit:
user = User(username=username)
user.is_staff = True
user.is_superuser = True
user.save()
return user
return None
def get_user(self, user_id):
try:
return User.object.get(pk=user_id)
except User.DoesNotExist:
return None
何やら難しいコードが書かれていますね。
settings.pyで定義されたユーザー名とパスワードを認証し、ユーザーの認証が初めてであった場合にUserオブジェクトを作成するバックエンドの例だそうです。
認証バックエンド方式まで変更したい人はここまでのコードを読み込む必要がありますが、私のような個人が使う分には変更する必要はないかと。
BaseBackendも気になりますが、私はDjango初学者なので深追いはここまでにしておきます。
ちなみに、ログイン画面のレイアウトはサインインと全く同じです。Bootstrapのサンプルを利用させてもらってます。
今回は以上になります。お疲れさまでした!