【Django】django.contrib.auth.urlsのログインについて

Djangoの標準機能で用意されているdjango.contrib.auth.urlsについて記載します。
django.contrib.auth.urlsを使用することで簡単にユーザのログインやログアウトなどの機能を実装することができます。
当記事では呼び出すことができるURLについて説明していきます。
## 設定方法
django.contrib.auth.urlsはsettings.pyに記載することで使用可能になります
```settings.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('accounts/', include('django.contrib.auth.urls')),
]
```
urlpatternsのリストに入れることで呼び出すことができるようになり、以下URLを呼び出すことができるようになります。
```
accounts/login/ [name='login']
accounts/logout/ [name='logout']
accounts/password_change/ [name='password_change']
accounts/password_change/done/ [name='password_change_done']
accounts/password_reset/ [name='password_reset']
accounts/password_reset/done/ [name='password_reset_done']
accounts/reset/<uidb64>/<token>/ [name='password_reset_confirm']
accounts/reset/done/ [name='password_reset_complete']
```
ログイン、ログアウト、パスワード変更、パスワード初期化が使用できるようです。
サインアップ機能が存在しないため、手動で作成する必要があります。
## ログイン機能
以下html（今回はlogin.htmlとする）を作成します
```login.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>ログイン</title>
</head>
<body>
  <h2>ログイン</h2>
  <form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Login</button>
  </form>
</body>
</html>
```
```
{{ form.as_p }}
```
上記で使用するformタグが表示されます。
実際にChrome等で見てみると以下になります
```login.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>ログイン</title>
  </head>
  <body>
    <h2>ログイン</h2>
    <form action="post">
      <label>ユーザー名</label>
      <input type="text">
      <label>パスワード</label>
      <input type="password">
      <button type="submit">ログイン</button>
    </form>
  </body>
</html>
```
ログインできているかの判定はセッションが存在するかで確認できます
ログイン後にhome.htmlにリダイレクトされた際にログインしている場合とログインしていない場合は以下のように記載できる。
```home.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Home</title>
  </head>
  <body>
    {% if user.is_authenticated %}
      <p>{{ user.username }}さんがログインしてます</p>
    {% else %}
      <p>ログインしてません</p>
      <a href="{% url 'login' %}">Log In</a>
    {% endif %}
  </body>
</html>
```
```
    {% if user.is_authenticated %}
      <p>{{ user.username }}さんがログインしてます</p>
    {% else %}
      <p>ログインしてません</p>
      <a href="{% url 'login' %}">Log In</a>
    {% endif %}
```
上記でログイン済みの場合はusernameが表示され、ログインしていない場合はloginのリンクが表示されます。

## 登録されるDB情報
Djangoでは最初に以下コマンドでスキーマを作成します
```
$ python manage.py migrate
```
この時に作成されるテーブルは以下になります。
```
mysql> show tables;
+----------------------------+
| Tables_in_jobpit-db        |
+----------------------------+
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
+----------------------------+
10 rows in set (0.00 sec)
```
auth_userテーブルを確認したところ、ここにユーザ情報が登録されるようです。
手動でユーザ情報を確認した場合はauth_userテーブルを確認するのが良いかと思います。
```
mysql> desc auth_user;
+--------------+--------------+------+-----+---------+----------------+
| Field        | Type         | Null | Key | Default | Extra          |
+--------------+--------------+------+-----+---------+----------------+
| id           | int          | NO   | PRI | NULL    | auto_increment |
| password     | varchar(128) | NO   |     | NULL    |                |
| last_login   | datetime(6)  | YES  |     | NULL    |                |
| is_superuser | tinyint(1)   | NO   |     | NULL    |                |
| username     | varchar(150) | NO   | UNI | NULL    |                |
| first_name   | varchar(150) | NO   |     | NULL    |                |
| last_name    | varchar(150) | NO   |     | NULL    |                |
| email        | varchar(254) | NO   |     | NULL    |                |
| is_staff     | tinyint(1)   | NO   |     | NULL    |                |
| is_active    | tinyint(1)   | NO   |     | NULL    |                |
| date_joined  | datetime(6)  | NO   |     | NULL    |                |
+--------------+--------------+------+-----+---------+----------------+
11 rows in set (0.00 sec)
```

以上です。