1. 程式人生 > >Django自帶用戶驗證框架

Django自帶用戶驗證框架

eat 一個 onetoone ast staf req als rect blank

一 分析源碼 User

Django的標準庫存放在 django.contrib 包中。每個子包都是一個獨立的附加功能包。

這些子包一般是互相獨立的,不過有些django.contrib子包需要依賴其他子包,其中django.contrib.auth 為Django的用戶驗證框架

1. 導入方法

from django.contrib.auth.models import User

2. 分析User繼承鏈

User --> AbstractUser --> (AbstractBaseUser, PermissionsMixin)

UserManger --> BaseUserManager

其中類AbstractUser內部中 username、first_name、last_name、email、is_staff、is_active、objects = UserManager()

類UserManager內部中 create_user()和create_superuser()

類AbstractBaseUser內部中 password、last_login、is_authenticated、set_password()

3. 小結

模仿 AbstractUser繼承 AbstractBaseUser,調用UserManager(),實現賬號定制

二 賬號定制

# 用來創建用戶
class MyUserManager(BaseUserManager):
    def create_user(self, email, name, password=None):
        if not email:
            raise ValueError(‘Users must have an email address‘)
        user = self.model(
            email=self.normalize_email(email),
            name=name,
        )
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, name, password):
        user = self.create_user(
            email,
            password=password,
            name=name,
        )
        user.is_admin = True
        user.save(using=self._db)
        return user


# 定制賬號基本信息
class Account(AbstractBaseUser):
    
    email = models.EmailField(
        verbose_name=‘email address‘,
        max_length=255,
        unique=True,
    )
    name = models.CharField(max_length=32)
    role = models.ForeignKey("Role", blank=True, null=True)
    customer = models.OneToOneField("Customer", blank=True, null=True)

    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)

    objects = MyUserManager()

    USERNAME_FIELD = ‘email‘
    REQUIRED_FIELDS = [‘name‘]

    # 其他基本信息......

參考鏈接 https://docs.djangoproject.com/en/1.11/topics/auth/customizing/

三 登錄與退出

1. 導入方法

from django.contrib.auth.decorators import login_required

from django.contrib.auth import authenticate, login, logout

2. 分析模塊

@login_required 驗證需要登錄的頁面,否則跳轉找配置裏的登錄頁面 LOGIN_URL = ‘/login/‘

authenticate(username=username, password=password),認證通過返回user對象,否則None

login(request, user) 寫入登錄sessioin

logout(request) 清除登錄session

3.3 示例

from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from django.contrib.auth import authenticate, login, logout


@login_required
def dashboard(request):
    return render(request, ‘dashboard.html‘)


def account_login(request):
    if request.method == "POST":
        username = request.POST.get(‘username‘)
        password = request.POST.get(‘password‘)
        user = authenticate(username=username, password=password)
        if user:
            login(request, user)
            return redirect(request.GET.get(‘next‘) or ‘/dashboard/‘)
    return render(request, ‘login.html‘)


def account_logout(request):
    logout(request)
    return redirect(‘/login/‘)

  

Django自帶用戶驗證框架