【Django】飾りのない簡単なユーザ認証

Djangoにはdjango.contrib.authという認証システムが標準搭載されているみたいです。

しかし、その実装で苦戦したので、飾りのないシンプルな構成を記録しておきます。

ソースはココ

こんな感じ

こんな感じで、飾りのないユーザ認証ができます。

飾り付けはご自由に。

5分で実装

再現性を保つために、プロジェクトの作成から始めます。

# プロジェクト作成
$ django-admin startproject myproject
$ cd myproject

# マイグレート
$ python manage.py migrate

# accountsアプリ作成(この名前じゃなきゃいけないっぽい?)
$ django-admin startapp accounts

# 設定をちょいといじる
$ vi myapp/settings.py

INSTALLED_APPS = [
    'accounts.apps.AccountsConfig', # 追記
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

LOGOUT_REDIRECT_URL = '/' # 追記
# ルーティング設定
$ vi myproject/urls.py

=============ここから==============
from django.contrib import admin
from django.urls import path, include # 追記

urlpatterns = [
    path('accounts/', include('django.contrib.auth.urls')), # 追記
    path('', include('accounts.urls')), # 追記
    path('admin/', admin.site.urls),
]
=============ここまで==============

# ルーティング設定
$ vi accounts/views.py

=============ここから==============
from django.shortcuts import render
from django.contrib.auth.decorators import login_required

@login_required
def index(request):
    return render(request, 'accounts/top.html')
=============ここまで==============
# テンプレートの作成
$ mkdir -p accounts/templates/accounts
$ mkdir accounts/templates/commons
$ mkdir accounts/templates/registration

# ベースとなるhtmlを作成
$ vi accounts/templates/commons/base.html

=============ここから==============
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>
      {% block title %}{% endblock %}
    </title>
</head>
<body>
    {% block headertitle %}{% endblock %}
    {% if user.is_authenticated %}
        <a href="{% url 'logout' %}" class="logout">ログアウトするよん</a>
    {% else %}
    {% endif %}
    {% block content %}{% endblock %}
</body>
</html>
=============ここまで==============

# ログイン後のトップページを作成
$ vi accounts/templates/accounts/top.html

=============ここから==============
{% extends "commons/base.html" %}

{% block title %}トップページだよん{% endblock %}
{% block headertitle %}ヘッダーだよん{% endblock %}
{% block content %}<h1>キタ━━━━━━(゚∀゚)━━━━━━ !!!!!</h1>{% endblock %}
=============ここまで==============

# ログイン画面の作成
$ vi accounts/templates/registration/login.html

=============ここから==============
<!DOCTYPE html>
<html lang="ja-JP" >
<head>
    <title>ログイン</title>
</head>

<body>
    <form method="post" action="{% url 'login' %}">
        {% csrf_token %}
        <input type="text" name="username" placeholder="ユーザー名">
        <input type="password" name="password" placeholder="パスワード">
        <input type="submit" class="btn btn-primary btn-block" value="ログイン" />
        <input type="hidden" name="next" value="{{ next }}" />
    </form>
</body>
</html>
=============ここまで==============
# 管理ユーザの作成
$ python manage.py createsuperuser

# 開発サーバ起動
$ python manage.py runserver

# 以下にアクセスし、ユーザ認証を確認する
http://localhost:8000/