diadia

趣味のプログラムを書く 

User Login ページの作り方

あんまり分かっていないのでメモ程度の内容に留める。

編集ファイルはこれらになる。
forms.py
views.py
urls.py
login_page.html

イメージはforms.pyにて入力フォームを規定して、それをviews.pyに反映させる。views.pyとlogin_page.htmlの関係性は普段と同じ通り。urls.pyも同じように扱っていれば問題なし。混乱しているのはviews.pyを如何に書くか。ここだけだ。


forms.py

from django import forms

class LoginForm(forms.Form):
    username = forms.CharField()
    password = forms.CharField(widget=forms.PasswordInput)

疑問なのはPasswordInputはなんの役割を果たしているか。ここが分かっていない。

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()。この関係性がポイント。