Django のログイン認証について説明をします。Django はログイン認証のための仕組みを持っていますので、とても簡単に実装することができます。
公式ドキュメントにたくさん情報がありますので、何かわからないことがあれば、公式のドキュメントを読めば大丈夫でしょう。公式ドキュメント
Contents
バージョン
- 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">© 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 のログイン認証について簡単に説明しました。
ほとんどの場合は、デフォルトのままで大丈夫かと思いますが、ログインユーザーのモデルや認証バックエンドは、カスタマイズ可能なので、既存の認証システムに合わせることもできます。とりあえず今回は、一番基本的なこと説明しました。