文章

Django - 使用者系統實作

使用者系統是任何 Web 應用的核心部分之一,負責管理使用者的身份認證、權限設定以及與應用功能的互動。本節課將教你如何在 Django 中實現完整的使用者系統,包括註冊、登入、登出、密碼重設以及權限管理。


課程目標

  1. 理解 Django 認證系統的核心概念與結構。
  2. 實現使用者註冊、登入、登出和密碼管理功能。
  3. 使用 django.contrib.authdjango.contrib.sessions 管理使用者狀態。
  4. 學會配置權限,保護應用中的資源。

課程內容

1. Django 認證系統概述

Django 提供了內建的認證系統,包含以下主要模組:

  • User 模型:提供使用者相關的字段(如 usernameemailpassword)。
  • 認證後端:驗證使用者憑證的邏輯。默認支持基於數據庫的憑證驗證。
  • Session 管理:處理使用者的登入狀態。
  • 權限系統:管理使用者角色和資源訪問控制。

2. 使用者系統的實作

步驟 1:建立應用

創建一個 users 應用來管理使用者功能:

1
python manage.py startapp users

settings.py 中加入:

1
INSTALLED_APPS += ['users']

步驟 2:自定義 User 模型(選擇性)

如果需要擴展內建的 User 模型:

1
2
3
4
5
6
7
8
from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
    phone_number = models.CharField(max_length=15, blank=True, null=True)

# 在 settings.py 中指定自定義模型
AUTH_USER_MODEL = 'users.CustomUser'

執行遷移命令:

1
2
python manage.py makemigrations
python manage.py migrate

步驟 3:實現註冊功能

users/forms.py 中創建註冊表單:

1
2
3
4
5
6
7
8
9
10
11
12
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth import get_user_model

User = get_user_model()

class UserRegisterForm(UserCreationForm):
    email = forms.EmailField()

    class Meta:
        model = User
        fields = ['username', 'email', 'password1', 'password2']

users/views.py 中創建視圖:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from django.shortcuts import render, redirect
from .forms import UserRegisterForm
from django.contrib import messages

def register_view(request):
    if request.method == 'POST':
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            form.save()
            messages.success(request, "註冊成功,請登入!")
            return redirect('login')
    else:
        form = UserRegisterForm()
    return render(request, 'users/register.html', {'form': form})

users/templates/users/register.html

1
2
3
4
5
<h2>註冊</h2>
<form method="POST">
  {% csrf_token %} {{ form.as_p }}
  <button type="submit">註冊</button>
</form>

步驟 4:實現登入與登出功能

  • users/views.py 中:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from django.contrib.auth import login, logout, authenticate
from django.shortcuts import redirect, render
from django.contrib import messages

def login_view(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(request, username=username, password=password)
        if user is not None:
            login(request, user)
            messages.success(request, "登入成功!")
            return redirect('home')
        else:
            messages.error(request, "無效的使用者名稱或密碼!")
    return render(request, 'users/login.html')

def logout_view(request):
    logout(request)
    messages.success(request, "已登出!")
    return redirect('home')
  • users/templates/users/login.html
1
2
3
4
5
6
7
<h2>登入</h2>
<form method="POST">
  {% csrf_token %}
  <input type="text" name="username" placeholder="使用者名稱" />
  <input type="password" name="password" placeholder="密碼" />
  <button type="submit">登入</button>
</form>

3. 密碼重設功能

步驟 1:配置郵件設置

settings.py 中添加郵件配置:

1
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

步驟 2:內建密碼重設視圖

urls.py 中使用 Django 提供的視圖:

1
2
3
4
5
6
7
8
from django.contrib.auth import views as auth_views

urlpatterns = [
    path('password-reset/', auth_views.PasswordResetView.as_view(), name='password_reset'),
    path('password-reset/done/', auth_views.PasswordResetDoneView.as_view(), name='password_reset_done'),
    path('reset/<uidb64>/<token>/', auth_views.PasswordResetConfirmView.as_view(), name='password_reset_confirm'),
    path('reset/done/', auth_views.PasswordResetCompleteView.as_view(), name='password_reset_complete'),
]

Django 會自動處理相關的邏輯,並生成相應的模板。


4. 使用者權限管理

步驟 1:設置權限

為模型定義權限:

1
2
3
4
5
6
class Post(models.Model):
    ...
    class Meta:
        permissions = [
            ('can_publish', 'Can publish posts'),
        ]

步驟 2:檢查權限

在視圖中檢查權限:

1
2
3
4
5
from django.contrib.auth.decorators import permission_required

@permission_required('blog.can_publish', raise_exception=True)
def publish_post_view(request, post_id):
    ...

課堂練習

  1. 在 Blog 系統中添加註冊、登入與登出功能。
  2. 配置密碼重設功能,並測試郵件發送邏輯。
  3. 為 Blog 的文章管理功能添加權限控制(僅管理員可發布文章)。

作業

  1. 自定義 User 模型,添加額外的欄位(如手機號碼),並將其應用於現有系統中。
  2. 完成登入、登出和註冊的所有頁面設計(加入前端樣式)。
  3. 編寫測試用例,測試使用者系統的各個功能(如註冊、登入、權限檢查)。

本文章以 CC BY 4.0 授權