django auth模塊幫你實現完整的用戶體系 | Python 主題月

本文正在參加「Python主題月」,詳情查看 活動連接python

微信公衆號搜索【程序媛小莊】,Rest cannot be enjoyed by lazy people~數據庫

前言

在開發一個網站的時候不可避免的須要實現網站的用戶系統,包括用戶註冊、用戶登陸、用戶認證、用戶註銷等功能,本身寫起來就很麻煩,django做爲一個完美主義者的終極框架,確定也考慮到這些問題了,django解決這些問題的方式就是強大的內置用戶認證系統-auth,本文就來詳細介紹一下django的auth認證功能。django

auth模塊簡介

django提供了一個很是好用的組件,這個組件主要負責用戶登陸認證的全套功能,它就是auth組件。有了auth組件,咱們就不須要再手動寫登陸校驗裝飾器,不須要再手動設置session保存用戶狀態。django項目執行數據庫遷移命令後會生成一堆默認的表,其中就包括auth_user表,auth組件和這張表有密切關係。另外,django項目默認都會有一個admin後臺管理系統,登陸的用戶信息是保存在auth_user表中的;且用戶分爲普通用戶和超級用戶,只有超級用戶能夠登陸admin後臺管理系統。微信

python manage.py createsuperuser
# 郵箱能夠不寫,密碼長度最短8位,建立完成以後就能夠登陸django後臺管理了。
複製代碼

auth模塊的基本使用

登錄校驗:auth.authenticate()markdown

from django.contrib import auth

user_obj = auth.authenticate(request,
                             username=username,
                             password=password)

print(user_obj) 
print(user_obj.username)

# 注意點:
    1.authenticate()括號內必須同時傳入用戶名和密碼
    2.密碼自動加密校驗
    3.校驗成功,返回當前對象,校驗失敗返回None
複製代碼

保存用戶狀態:auth.login()session

auth.login(request, user_obj)  
request.user  # 獲取當前登陸的用戶對象
# 注意點:
    1.該方法須要request、和當前登錄用戶對象倆個方法
    2.該方法自動設置session,相似於request.session[key] = user_obj
    3.只要執行了該方法後,就能夠在任何地方經過request.user獲取到當前登錄的用戶對象
複製代碼

登陸裝飾器:判斷用戶是否登陸app

from django.contrib.auth.decorators import login_required


@login_required(login_url='/login/') 
def index(request):
    pass

# 注意點:
    1.未登陸時跳轉到的頁面須要手動設置;設置分局部設置和全局設置。
    2.局部設置,直接在裝飾器內經過參數login_url指定
    3.全局設置,在配置文件中經過參數LOGIN_URL = '/login/'設置
    4.裝飾器幫咱們在跳轉後的url後面添加了target_url,咱們在login的視圖函數中手動捕獲它
    4.局部設置的優先級高與全局的設置
    5.全局的好處在於無需重複寫代碼 可是跳轉的頁面卻很單一
    6.局部的好處在於不一樣的視圖函數在用戶沒有登錄的狀況下能夠跳轉到不一樣的頁面
複製代碼

用戶修改密碼如何進行校驗框架

- 如何進行原密碼的比對
request.user.check_password(old_password)
- 修改用戶信息
request.user.set_password(new_password)  # 僅僅是在修改對象的屬性
request.user.save()  # 這一步纔是真正的操做數據庫
複製代碼

如何註銷當前用戶:auth.logout(request)函數

用戶如何進行註冊post

# 方式1:操做auth_user表寫入數據(不推薦,密碼沒有加密處理)
from django.contrib.auth.models import User
User.objects.create(username=username, password=password) 


# 方式2:建立普通用戶
User.objects.create_user(username=username, password=password)


# 方式3:建立超級用戶
User.objects.create_superuser(username=username,
                              email='123@qq.com',
                              password=password)

#注意:
	1.方式2和方式3建立成功後返回當前對象
	2.使用代碼建立超級用戶,郵箱是必填的,而用命令建立則能夠不填
複製代碼

擴展auth_user表

這內置的認證系統這麼好用,可是auth_user表字段都是固定的那幾個,我在項目中無法拿來直接使用啊!

好比,我想要加一個存儲用戶手機號的字段,怎麼辦?

聰明的你可能會想到新建另一張表而後經過一對一和內置的auth_user表關聯,這樣雖然能知足要求可是有沒有更好的實現方式呢?答案是固然有了。

咱們能夠經過繼承內置的 AbstractUser 類,來定義一個本身的Model類。這樣既能根據項目需求靈活的設計用戶表,又能使用Django強大的認證系統了.

from django.contrib.auth.models import AbstractUser

class UserInfo(AbstractUser):
    nid = models.AutoField(primary_key=True)
    phone = models.CharField(max_length=11, null=True, unique=True)
    
    def __str__(self):
        return self.username
複製代碼

若是繼承了AbstractUser類,那麼在執行數據庫遷移命令的時候auth_user表就不會再建立出來了,而UserInfo表中會出現auth_user全部的字段外加本身擴展的字段,這麼作的好處在於你可以直接點擊你本身的表更加快速的完成操做及擴展。

可是使用這種方式的前提有如下幾個:

1.在繼承以前沒有執行過數據庫遷移命令
auth_user沒有被建立,若是當前庫已經建立了那麼你就從新換一個庫
2.繼承的類裏面不要覆蓋AbstractUser裏面的字段名
表裏面有的字段都不要動,只擴展額外字段便可
3.須要在配置文件中告訴django你要用UserInfo替代auth_user
AUTH_USER_MODEL = 'app01.UserInfo' # '應用名.表名'
4.若是本身寫表替代了auth_user那麼auth模塊的功能仍是照常使用,參考的表頁由原來的auth_user變成了UserInfo

結語

文章首發於微信公衆號程序媛小莊,同步於掘金

碼字不易,轉載請說明出處,走過路過的小夥伴們伸出可愛的小指頭點個贊再走吧(╹▽╹)

image.png

相關文章
相關標籤/搜索