Django - 使用者系統實作
使用者系統是任何 Web 應用的核心部分之一,負責管理使用者的身份認證、權限設定以及與應用功能的互動。本節課將教你如何在 Django 中實現完整的使用者系統,包括註冊、登入、登出、密碼重設以及權限管理。
課程目標
- 理解 Django 認證系統的核心概念與結構。
- 實現使用者註冊、登入、登出和密碼管理功能。
- 使用
django.contrib.auth
和django.contrib.sessions
管理使用者狀態。 - 學會配置權限,保護應用中的資源。
課程內容
1. Django 認證系統概述
Django 提供了內建的認證系統,包含以下主要模組:
- User 模型:提供使用者相關的字段(如
username
、email
、password
)。 - 認證後端:驗證使用者憑證的邏輯。默認支持基於數據庫的憑證驗證。
- 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):
...
課堂練習
- 在 Blog 系統中添加註冊、登入與登出功能。
- 配置密碼重設功能,並測試郵件發送邏輯。
- 為 Blog 的文章管理功能添加權限控制(僅管理員可發布文章)。
作業
- 自定義
User
模型,添加額外的欄位(如手機號碼),並將其應用於現有系統中。 - 完成登入、登出和註冊的所有頁面設計(加入前端樣式)。
- 編寫測試用例,測試使用者系統的各個功能(如註冊、登入、權限檢查)。
本文章以 CC BY 4.0 授權