最小限の作業でDjangoにログイン機能を実装する方法


> この記事は[「Djangoで手短にログイン処理」](https://qiita.com/yonaka15/items/045e578d1d2edae181ad)（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`ファイルに以下を追加します。

```python
# 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`としておきます：

```bash
python manage.py startapp accounts
```

次に、テンプレートディレクトリを作成します：

```bash
mkdir -p accounts/templates/registration
```

これにより以下のようなディレクトリ構造が作成されます：

```
projectname/
  accounts/
    templates/
      registration/
```

### 3. ログインテンプレートを作成

`registration`ディレクトリ内に`login.html`ファイルを作成します：

```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`に登録します：

```python
# projectname/settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',  # 認証システムが登録されていることを確認
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'accounts',  # 作成したアプリを追加
]
```

また、ログイン後のリダイレクト先も設定しておくと便利です：

```python
# projectname/settings.py

# ログイン後のリダイレクト先
LOGIN_REDIRECT_URL = 'home'  # 'home'は自分のプロジェクトのホームページURLの名前に変更してください
```

### 5. テンプレートディレクトリを設定

Djangoがテンプレートを見つけられるように、`settings.py`の`TEMPLATES`設定を確認してください。

```python
# projectname/settings.py

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],  # ここが空なら、各アプリのtemplatesディレクトリを自動で探します
        'APP_DIRS': True,  # これがTrueであれば、アプリのtemplatesディレクトリを探します
        # その他の設定...
    },
]
```

## 動作確認

開発サーバーを起動します：

```bash
python manage.py runserver
```

以下のURLにアクセスしてログインページが表示されることを確認しましょう：

```
http://localhost:8000/accounts/login/
```

ログインページが表示され、ユーザー認証が機能することを確認してください。ログイン時に特定のページへリダイレクトしたい場合は、URLパラメータ`next`を使います：

```
http://localhost:8000/accounts/login/?next=/desired/page/
```

## セキュリティに関する注意

実際の運用環境では、以下の点に注意してください：

1. **HTTPS**を使用して通信を暗号化する
2. パスワードの複雑さポリシーを実装する
3. ブルートフォース攻撃対策として、ログイン試行回数制限を設定する
4. テンプレートのデザインを改善し、ユーザーフレンドリーなエラーメッセージを表示する

## まとめ

Djangoの認証システムは非常に強力で柔軟性があります。この記事で紹介した基本設定に加えて、以下のような機能も比較的簡単に追加できます：

- ソーシャルログイン（OAuth）
- 二要素認証
- カスタムユーザーモデル
- アクセス制限（`@login_required`デコレータの使用）

わずか数ステップでログイン機能を実装できるのが、Djangoの大きな強みです。これを基盤として、必要に応じて認証システムをカスタマイズしていくことができます。

## 参考資料

- [Django 公式ドキュメント：認証システム](https://docs.djangoproject.com/en/5.1/topics/auth/)
- [Django 公式ドキュメント：ユーザー認証](https://docs.djangoproject.com/en/5.1/topics/auth/default/)