フリーランス 技術調査ブログ

フリーランス/エンジニア Ruby Python Nodejs Vuejs React Dockerなどの調査技術調査の備忘録

Djangoユーザー認証が便利①

はじめに

  • Djangoは、認証機能と権限機能の両方を共に提供されています。標準でマイグレーションするとデフォルトで作成されるUserテーブルを利用して 認証機能を実装することができます。 docs.djangoproject.com

ユーザー管理

下記の機能を実装することが可能です。 - ユーザー登録 - ログイン - ログアウト(次回) - 認証(次回) - ログイン判定(次回)

ユーザー登録画面

f:id:PX-WING:20200809230439p:plain

ログイン画面

f:id:PX-WING:20200809231300p:plain

コード

アプリケーションのsetting.py

from django.urls import path
from .views import signup, login

urlpatterns = [
    path('signup/', signup, name='signup'),
    path('login/', login, name='login'),
]

アプリケーションのview.py

from django.shortcuts import render, redirect
from django.contrib.auth.models import User
from django.contrib.auth import authenticate
from django.contrib.auth import login as auth_login

## ログイン処理の画面
def login(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(request, username=username, password=password)
        if user is not None:
            auth_login(request, user)
            return redirect('list')
        else:
            return redirect('login')
    return render(request, 'login.html')

## ユーザー登録
def signup(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        try:
            User.objects.create_user(username, '', password)
            return render(request, 'signup.html'
        except:
            return render(request, 'signup.html', {'error': 'このユーザーは登録されています'})
    return render(request, 'signup.html')

テンプレートファイル

  • ユーザー作成画面
{% extends 'base.html' %}

{% block content %}
<div class="container">
    <form class="form-signin" method="POST" action=''>{% csrf_token %}
        <img class="mb-4" src="/docs/4.5/assets/brand/bootstrap-solid.svg" alt="" width="72" height="72">
        <h1 class="h3 mb-3 font-weight-normal">ユーザー登録</h1>
        {% if error %}
        {{ error }}
        {% endif %}
        <label for="inputUserName" class="sr-only">UserName</label>
        <input type="text" id="inputUserName" class="form-control" name='username' placeholder="User Name" required
            autofocus>
        <label for="inputPassword" class="sr-only">Password</label>
        <input type="password" id="inputPassword" class="form-control" name='password' placeholder="Password" required>
        <div class="checkbox mb-3">
        </div>
        <button class="btn btn-lg btn-primary btn-block" type="submit">ユーザー登録</button>
        <p class="mt-5 mb-3 text-muted">&copy; 2017-2020</p>
    </form>
</div>

{% endblock content%}
  • ログイン画面
{% extends 'base.html' %}

{% block content %}
<div class="container">
    <form class="form-signin" method="POST" action=''>{% csrf_token %}
        <img class="mb-4" src="/docs/4.5/assets/brand/bootstrap-solid.svg" alt="" width="72" height="72">
        <h1 class="h3 mb-3 font-weight-normal">ログイン</h1>
        {% if error %}
        {{ error }}
        {% endif %}
        <label for="inputUserName" class="sr-only">UserName</label>
        <input type="text" id="inputUserName" class="form-control" name='username' placeholder="ユーザー名を入力して下さい" required
            autofocus>
        <label for="inputPassword" class="sr-only">Password</label>
        <input type="password" id="inputPassword" class="form-control" name='password' placeholder="パスワードを入力して下さい"
            required>
        <div class="checkbox mb-3">
        </div>
        <button class="btn btn-lg btn-primary btn-block" type="submit">ログイン</button>
        <p class="mt-5 mb-3 text-muted">&copy; 2020</p>
    </form>
</div>
{% endblock content%}