Django ユーザー認証(Auth)コンポーネント

Django ユーザー認証(Auth)コンポーネントは一般的にユーザーのログイン・登録に使用され、現在のユーザーが正当かどうかを判断し、ログイン成功または失敗ページにリダイレクトします。

Django ユーザー認証(Auth)コンポーネントを使用するには、auth モジュールをインポートする必要があります:

# 认证模块
from django.contrib import auth

# 对应数据库
from django.contrib.auth.models import User

戻り値はユーザーオブジェクトです。

ユーザーオブジェクトを作成する3つの方法:

  • create():普通ユーザーを作成し、パスワードは平文です。
  • create_user():普通ユーザーを作成し、パスワードは暗号化されています。
  • create_superuser():スーパーユーザーを作成し、パスワードは暗号化されています。email パラメータを追加で渡す必要があります。

パラメータ:

  • username: ユーザー名。
  • password:パスワード。
  • email:メールアドレス (create_superuser メソッドでは email を追加で渡す必要があります)。
from django.contrib.auth.models import User 
User.objects.create(username='runboo',password='123')

from django.contrib.auth.models import User 
User.objects.create_user(username='runbooo',password='123')

from django.contrib.auth.models import User 
User.objects.create_superuser(username='runboooo',password='123',email='[email protected]')

ユーザーのユーザー名とパスワードを検証するには authenticate() メソッドを使用し、auth_user テーブルからユーザーオブジェクトをフィルタリングします。

使用前にインポートする必要があります:

from django.contrib import auth

パラメータ:

  • username:ユーザー名
  • password:パスワード

戻り値:検証が成功した場合はユーザーオブジェクトを返し、失敗した場合は None を返します。

例

def login(request):
    if request.method == "GET":
        return render(request, "login.html")
    username = request.POST.get("username")
    password = request.POST.get("pwd")
    valid_num = request.POST.get("valid_num")
    keep_str = request.session.get("keep_str")
    if keep_str.upper() == valid_num.upper():
        user_obj = auth.authenticate(username=username, password=password)
        print(user_obj.username)

認証に成功したユーザーに session を設定し、request.user をユーザーオブジェクトに代入します。

ログインには login() メソッドを使用します。

使用前にインポートする必要があります:

from django.contrib import auth

パラメータ:

  • request:ユーザーオブジェクト

戻り値:None

例

def login(request):
    if request.method == "GET":
        return render(request, "login.html")
    username = request.POST.get("username")
    password = request.POST.get("pwd")
    valid_num = request.POST.get("valid_num")
    keep_str = request.session.get("keep_str")
    if keep_str.upper() == valid_num.upper():
        user_obj = auth.authenticate(username=username, password=password)
        print(user_obj.username)
        if not user_obj:
            return redirect("/login/")
        else:

            auth.login(request, user_obj)
            path = request.GET.get("next") or "/index/"
            print(path)
            return redirect(path)
    else:
        return redirect("/login/")

ユーザーのログアウトには logout() メソッドを使用し、session 情報をクリアして、request.user を匿名ユーザーに代入します。

使用前にインポートする必要があります:

from django.contrib import auth

パラメータ:

  • request:ユーザーオブジェクト

戻り値:None

例

def logout(request):
    ppp = auth.logout(request)
    print(ppp) # None
    return redirect("/login/")

デコレータを設定し、ログイン成功後にのみアクセスできるページに一括でデコレータを追加します。

使用前にインポートする必要があります:

from django.contrib.auth.decorators import login_required

例

from django.contrib.auth.decorators import login_required @login_required
def index(request):
  return HttpResponse("indexページ...")

アクセス元のページを設定し、ログイン成功後にはそのページに戻るようにします。

解説:

django はユーザーがページにアクセスする際、ユーザーが未ログイン状態であれば、ユーザーにログインページを返します。

このとき、ログインページの URL の後ろにはパラメータ next=ユーザーがアクセスしたページの URL が付いています。

したがって、ユーザーのログイン成功後にリダイレクトする URL を next パラメータの値に設定します。

しかし、ユーザーが最初からログインページ logi を入力した場合、request.GET.get("next") は値を取得できないため、後ろに or を追加することで、カスタムの戻り先ページを設定できます。

例

# 直接 login を入力した場合、get() は値を取得できない。path で戻り先ページをカスタム設定できる
path = request.GET.get("next") or "/index/"
return redirect(path)

その他の拡張