この記事は「Djangoで手短にログイン処理」(2018年2月投稿)を元に、最新のDjango 5.1向けに更新したものです。
はじめに
Djangoは強力なPython用Webフレームワークであり、ユーザー認証機能も標準で備えています。認証システムには、ログイン、ログアウト、パスワード管理などの機能が含まれていますが、テンプレートは自分で用意する必要があります。
本記事では、最小限の作業でDjangoにログイン機能を実装する方法を解説します。元記事は2018年に書きましたが、2025年現在の Django 5.1 でも基本的なアプローチは変わっていないようです。
環境
- Python 3.11以上
- Django 5.1
- 新規または既存のDjangoプロジェクト
手順
1. URLを設定する
まず、認証用のURLを設定します。urls.py
ファイルに以下を追加します。
# projectname/urls.py
from django.urls import include, path
urlpatterns = [
# 既存のパスはそのままに...
path('accounts/', include('django.contrib.auth.urls')),
]
この一行で、以下のURLパターンが自動的に追加されます:
-
accounts/login/
- ログインページ -
accounts/logout/
- ログアウト -
accounts/password_change/
- パスワード変更 -
accounts/password_change/done/
- パスワード変更完了 -
accounts/password_reset/
- パスワードリセット -
accounts/password_reset/done/
- パスワードリセット完了 -
accounts/reset/<uidb64>/<token>/
- パスワードリセット確認 -
accounts/reset/done/
- パスワードリセット完了
2. テンプレートディレクトリを作成
Djangoの認証システムは特定のテンプレートを探します。これらのテンプレートはtemplates/registration/
ディレクトリに配置する必要があります。
まず、テンプレートを配置するためのアプリを作成します。アプリ名は任意ですが、ここではaccounts
としておきます:
python manage.py startapp accounts
次に、テンプレートディレクトリを作成します:
mkdir -p accounts/templates/registration
これにより以下のようなディレクトリ構造が作成されます:
projectname/
accounts/
templates/
registration/
3. ログインテンプレートを作成
registration
ディレクトリ内にlogin.html
ファイルを作成します:
<!-- accounts/templates/registration/login.html -->
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>ログイン</title>
</head>
<body>
<h2>ログイン</h2>
{% if form.errors %}
<p>ユーザー名とパスワードが一致しません。もう一度お試しください。</p>
{% endif %}
<form method="post" action="{% url 'login' %}">
{% csrf_token %}
<table>
{{ form.as_table }}
</table>
<button type="submit">ログイン</button>
<input type="hidden" name="next" value="{{ next }}">
</form>
<p><a href="{% url 'password_reset' %}">パスワードをお忘れですか?</a></p>
</body>
</html>
4. アプリを登録する
作成したアプリをsettings.py
に登録します:
# projectname/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth', # 認証システムが登録されていることを確認
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'accounts', # 作成したアプリを追加
]
また、ログイン後のリダイレクト先も設定しておくと便利です:
# projectname/settings.py
# ログイン後のリダイレクト先
LOGIN_REDIRECT_URL = 'home' # 'home'は自分のプロジェクトのホームページURLの名前に変更してください
5. テンプレートディレクトリを設定
Djangoがテンプレートを見つけられるように、settings.py
のTEMPLATES
設定を確認してください。
# projectname/settings.py
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [], # ここが空なら、各アプリのtemplatesディレクトリを自動で探します
'APP_DIRS': True, # これがTrueであれば、アプリのtemplatesディレクトリを探します
# その他の設定...
},
]
動作確認
開発サーバーを起動します:
python manage.py runserver
以下のURLにアクセスしてログインページが表示されることを確認しましょう:
http://localhost:8000/accounts/login/
ログインページが表示され、ユーザー認証が機能することを確認してください。ログイン時に特定のページへリダイレクトしたい場合は、URLパラメータnext
を使います:
http://localhost:8000/accounts/login/?next=/desired/page/
セキュリティに関する注意
実際の運用環境では、以下の点に注意してください:
- HTTPSを使用して通信を暗号化する
- パスワードの複雑さポリシーを実装する
- ブルートフォース攻撃対策として、ログイン試行回数制限を設定する
- テンプレートのデザインを改善し、ユーザーフレンドリーなエラーメッセージを表示する
まとめ
Djangoの認証システムは非常に強力で柔軟性があります。この記事で紹介した基本設定に加えて、以下のような機能も比較的簡単に追加できます:
- ソーシャルログイン(OAuth)
- 二要素認証
- カスタムユーザーモデル
- アクセス制限(
@login_required
デコレータの使用)
わずか数ステップでログイン機能を実装できるのが、Djangoの大きな強みです。これを基盤として、必要に応じて認証システムをカスタマイズしていくことができます。