Logo

新人日誌

首頁關於我部落格

新人日誌

Logo

網站會不定期發佈技術筆記、職場心得相關的內容,歡迎關注本站!

網站
首頁關於我部落格
部落格
分類系列文

© 新人日誌. All rights reserved. 2020-present.

初學者指南:深入了解 Django 的 create_user 方法

最後更新:2025年1月29日Python

本文為 Django 登入註冊功能(後端)系列文,第 1 篇

  1. 新手指南|使用 Django 實現後端會員登入、註冊功能
  2. Django Rest Framework (DRF) 新手指南:為什麼選擇 DRF 建構 API?
  3. Django Rest Framework (DRF) 新手指南:用 ViewSets 快速構建 CRUD API
  4. 初學者指南:理解 Token 認證及其運作方式
  5. Django REST Framework (DRF) 認證方式、預設權限規則|新手指南
  6. Django Rest Framework 入門指南:如何正確處理 HTTP 狀態碼
  7. 初學者指南:深入了解 Django 的 create_user 方法 👈所在位置
  8. 新手指南:深入了解 Django 的 authenticate 方法
  9. Django REST Framework|@permission_classes指導手冊
  10. 使用 Postman 測試 Django 後端的註冊、登入與登出功能

在 Django 的開發過程中,使用者的管理是一個不可或缺的環節。

Django 提供了一個強大且易用的認證框架,而其中的 create_user 方法則是用來簡化和標準化使用者創建的核心工具。

無論您是剛開始學習 Django 還是對認證系統不太熟悉,本篇文章將從零開始,帶您全面了解 create_user 的功能、用法以及最佳實踐。


什麼是 create_user?

create_user 是 Django User 模型管理器 (UserManager) 中的一個方法,專門用來創建普通使用者(非超級管理員)。

它可以幫助開發者簡化處理使用者創建時的繁瑣細節,例如密碼加密和資料驗證。

常見的用法如下:

from django.contrib.auth.models import User

# 創建新使用者
user = User.objects.create_user(username='myusername', email='myemail@example.com', password='mypassword')

為什麼選擇 create_user?它有哪些功能?

create_user 的強大之處在於它自動化處理了許多細節,這不僅提升了開發效率,也能降低錯誤發生的機率。

密碼加密

為什麼需要加密密碼?

密碼以明文形式存儲會造成安全漏洞,一旦資料庫洩漏,所有使用者的帳戶都可能受到威脅。

Django 的 create_user 方法內建加鹽哈希(不可逆加密),確保密碼安全。

密碼加密範例

user = User.objects.create_user(username='testuser', password='12345')

# 密碼存儲在資料庫中時,會變成加密形式
print(user.password)
# 類似輸出:pbkdf2_sha256$320000$...(加密密碼)

資料驗證

create_user 方法確保使用者提供的資料有效,主要包括:

  • 檢查必填欄位是否提供(如 username 和 password)。
  • 檢查唯一性(例如,確保 username 不重複)。

資料驗證範例

如果試圖創建重複的使用者名稱,會拋出錯誤:

try:
    user1 = User.objects.create_user(username='testuser', password='12345')
    user2 = User.objects.create_user(username='testuser', password='54321')
except Exception as e:
    print(e)
# 輸出:UNIQUE constraint failed: auth_user.username

簡化邏輯

如果手動創建使用者,您需要自己處理密碼加密和資料驗證,這不僅繁瑣且容易出錯。

create_user 則簡化了整個過程:

# 手動加密的方式
from django.contrib.auth.hashers import make_password
user = User(username='manualuser', password=make_password('mypassword'))
user.save()

# 使用 create_user,自動加密與驗證
user = User.objects.create_user(username='autouser', password='mypassword')

create_user 方法的參數解析

以下是 create_user 的常見參數及其用途:

參數名稱是否必填說明
username✅使用者名稱,必須唯一,為識別使用者的主要欄位。
email❌使用者的電子郵件地址,非必填,但建議提供以用於密碼重設或通知功能。
password❌使用者的密碼,如果未提供,則會創建一個無法登入的使用者(需後續設定密碼)。
其他欄位❌若擴展了 User 模型,可以在這裡傳遞額外的自訂欄位(例如 phone_number)。
是否必填✅
說明使用者名稱,必須唯一,為識別使用者的主要欄位。
是否必填❌
說明使用者的電子郵件地址,非必填,但建議提供以用於密碼重設或通知功能。
是否必填❌
說明使用者的密碼,如果未提供,則會創建一個無法登入的使用者(需後續設定密碼)。
是否必填❌
說明若擴展了 User 模型,可以在這裡傳遞額外的自訂欄位(例如 phone_number)。

範例:

user = User.objects.create_user(
    username='newuser',
    email='newuser@example.com',
    password='securepassword123'
)

create_user 與 create_superuser 的區別

Django 提供了兩種方法來創建使用者:create_user 和 create_superuser。

方法用途預設權限
create_user創建普通使用者is_staff=False,is_superuser=False
create_superuser創建超級管理員is_staff=True,is_superuser=True
用途創建普通使用者
預設權限is_staff=False,is_superuser=False
用途創建超級管理員
預設權限is_staff=True,is_superuser=True

範例對比:

# 創建普通使用者
user = User.objects.create_user(username='regularuser', password='password123')
print(user.is_staff)  # False
print(user.is_superuser)  # False

# 創建超級管理員
admin = User.objects.create_superuser(username='adminuser', password='admin123')
print(admin.is_staff)  # True
print(admin.is_superuser)  # True

如何自訂 create_user 的行為?

有時,預設的 create_user 方法可能無法滿足所有需求(例如,您需要新增欄位)。

在這種情況下,可以通過自訂 User 模型和管理器來擴展功能。

自訂 User 模型

您可以擴展內建的 User 模型,為其添加額外欄位:

from django.contrib.auth.models import AbstractUser
from django.db import models

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

自訂 UserManager

在擴展模型後,您需要自訂管理器來覆蓋 create_user 方法:

from django.contrib.auth.models import BaseUserManager

class CustomUserManager(BaseUserManager):
    def create_user(self, username, email, password=None, **extra_fields):
        if not email:
            raise ValueError('電子郵件是必填欄位')
        email = self.normalize_email(email)
        user = self.model(username=username, email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

總結

  1. create_user 的核心價值
    • 簡化使用者創建過程,提供更安全的密碼處理方式。
    • 自動進行資料驗證,降低錯誤風險。
  2. 什麼時候應該使用 create_user?
    • 每當需要新增普通使用者到資料庫時,都應使用此方法。
  3. 擴展功能的可能性
    • 如果需要更多自訂欄位或特殊邏輯,可以通過擴展 User 模型和 UserManager 來實現。

學會了 create_user,您就掌握了 Django 認證系統的一項重要基石!

目前還沒有留言,成為第一個留言的人吧!

發表留言

留言將在審核後顯示。

Python

目錄

  • 什麼是 create_user?
  • 為什麼選擇 create_user?它有哪些功能?
  • 密碼加密
  • 資料驗證
  • 簡化邏輯
  • create_user 方法的參數解析
  • create_user 與 create_superuser 的區別
  • 如何自訂 create_user 的行為?
  • 自訂 User 模型
  • 自訂 UserManager
  • 總結