Django ログイン認証を実装する

シェアする

Django のログイン認証について説明をします。Django はログイン認証のための仕組みを持っていますので、とても簡単に実装することができます。

公式ドキュメントにたくさん情報がありますので、何かわからないことがあれば、公式のドキュメントを読めば大丈夫でしょう。公式ドキュメント

バージョン

  • Python 3.6.4
  • Django 2.0.3

インストール

Python、Django のインストールについては、こちらを参考にしてください。

settings.py

ALLOWED_HOSTS = ['*']
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app'
]
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
LANGUAGE_CODE = 'ja'
LOGIN_REDIRECT_URL = '/
LOGOUT_REDIRECT_URL = '/login/'

startproject コマンドを実行すると、settings.py を生成しますが、その中でログイン認証用の設定がすでに入っていますので、そのままにしましょう。

INSTALLED_APPS

  • ‘django.contrib.auth’

MIDDLEWARE

  • ‘django.contrib.auth.middleware.AuthenticationMiddleware’

上記以外にもログイン認証に必要な settings.py はあります。

ALLOWED_HOSTS の修正

localhost 以外からのアクセスを許可するために、’*’ をセットします。

INSTALLED_APPS の修正

startapp で app を作りましたので、INSTALLED_APPS に追加します。

app にはログイン画面などのテンプレートを配置します。

LAUNGUAGE_CODE を修正

認証失敗(Django デフォルトのエラーメッセージ)を日本語で確認したいので、LANGUAGE_CODE を ja にします。

LOGIN_REDIERCT_URL を追加

ログイン後のURLをセットします。

LOGOUT_REDIRECT_URL を追加

ログアウト後のURLをセットします。

DB migrate

DB の migrate を実行して、ログイン認証用のテーブルを作成します。

今回はデフォルトの sqlite を使っていますが、MySQL や PostgreSQL を使うべきです。

$ python3.6 manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying sessions.0001_initial... OK
$

createsuperuser

ログイン認証の確認のために、ユーザーを1人用意しておきます。

$ python3.6 manage.py createsuperuser
Username (leave blank to use 'vagrant'): test@test.test
Email address: test@test.test
Password:
Password (again):
Superuser created successfully.
$

urls.py

urls.py は以下のようにします。

from django.urls import path
from django.contrib.auth import views as auth_views
from django.views.generic import TemplateView

urlpatterns = [
    path('/', TemplateView.as_view(template_name='app/top.html'), name='top'),
    path('login/', auth_views.LoginView.as_view(template_name='app/login.html'), name='login'),
    path('logout/', auth_views.LogoutView.as_view(), name='logout'),
]

Templates

Bootstrap ベースに、適当なログイン画面とログイン後に遷移するトップ画面を作成します。

login.html(ログイン画面)

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta name="description" content="">
    <meta name="author" content="">

    <title>Login</title>

    <!-- Bootstrap core CSS -->
    <link href="https://getbootstrap.com/dist/css/bootstrap.min.css" rel="stylesheet">

    <!-- Custom styles for this template -->
    <link href="https://getbootstrap.com/docs/4.1/examples/sign-in/signin.css" rel="stylesheet">
  </head>
  <body class="text-center">
    <form class="form-signin" method="post">{% csrf_token %}
      {{ form.errors }}
      <h1 class="h3 mb-3 font-weight-normal">Please sign in</h1>
      <label for="inputEmail" class="sr-only">Email address</label>
      <input type="email" id="inputEmail" name="username" class="form-control" placeholder="Email address" required autofocus>
      <label for="inputPassword" class="sr-only">Password</label>
      <input type="password" id="inputPassword" name="password" class="form-control" placeholder="Password" required>
      <div class="checkbox mb-3">
        <label>
          <input type="checkbox" value="remember-me"> Remember me
        </label>
      </div>
      <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
      <p class="mt-5 mb-3 text-muted">&copy; 2017-2018</p>
    </form>
  </body>
</html>

username と password の name 属性 input を作成し、form を post にして {% csrf_token %} を付けてください。

top.html(トップ画面)

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta name="description" content="">
    <meta name="author" content="">

    <title>Top</title>

    <!-- Bootstrap core CSS -->
    <link href="https://getbootstrap.com/dist/css/bootstrap.min.css" rel="stylesheet">

    <!-- Custom styles for this template -->
  </head>

  <body>

    <!-- Begin page content -->
    <main role="main" class="container">
      <h1 class="mt-5">Top</h1>
      <a class="btn btn-link" href="{% url 'logout' %}">logout</a>
    </main>

  </body>
</html>

tree

ファイル構成はこうなりました。

$ tree
.
├── app
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── templates
│   │   └── app
│   │   ├── login.html
│   │   └── top.html
│   ├── tests.py
│   └── views.py
├── db.sqlite3
├── login
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py

5 directories, 15 files
$

画面

runserver を実行し、画面にアクセスしてみます。

$ python3.6 manage.py runserver 0.0.0.0:8000

ログイン (http://192.168.33.10:8000/login/)

先ほど createsuperuser で作成したユーザでログインすると、トップ画面に遷移します。

トップ (http://192.168.33.10:8000/)

logout リンクをクリックすると、ログイン画面に遷移します。

まとめ

Django のログイン認証について簡単に説明しました。

ほとんどの場合は、デフォルトのままで大丈夫かと思いますが、ログインユーザーのモデルや認証バックエンドは、カスタマイズ可能なので、既存の認証システムに合わせることもできます。とりあえず今回は、一番基本的なこと説明しました。

シェアする

フォローする