目錄python
首先咱們要知道Auth模塊解決的是哪些問題,其實但凡是和用戶相關的功能,均可以用auth模塊來實現,好比用戶的註冊,登陸,修改密碼,修改權限等,均可以用auth模塊來實現,能夠極大的縮短咱們的開發週期,並且對後期的維護和二次開發也有不少的益處,可是要注意的一點是,若是咱們使用了auth模塊,那麼咱們就要使用全套的該模塊,不要只用其一部分,而後本身再手寫其他功能,由於這樣數據之間的交互會出現問題,好比密碼的加密問題等等.數據庫
auth模塊默認用的是auth_user表來存儲用戶的數據,因此咱們學習用的話甚至都不用本身建數據庫,直接用django自帶的小型數據庫就能夠啦~django
下面咱們就介紹auth模塊經常使用的一些方法session
建立用戶學習
建立用戶一般有兩種,即普通用戶和管理員用戶,方法不太相同.網站
# 建立管理員用戶,經常使用的方法是Pycharm的Tools標籤->Run manage.py Task,而後在下面出現的輸入框裏輸入 createsuperuser # 而後窗口就會依次提醒你須要輸入的信息,包括帳號,密碼,郵箱等,這裏的郵箱是能夠空白的,不是強制輸入 # 建立管理員用戶還有第二種方法,不過不太經常使用 # 即咱們要首先導入用戶的表,而後用create_superuser來添加管理員用戶,這裏添加管理員的話郵箱必定要傳參,否則會報錯 from django.contrib.auth.models import User User.objects.create_superuser(username=username,password=password,email='123@**.com') # 建立普通用戶,即便用的是create_user關鍵字,傳參最少只須要用戶名和密碼便可 from django.contrib.auth.models import User User.objects.create_user(username=username,password=password) # 建立普通用戶
校驗用戶並保存用戶狀態ui
在建立完用戶以後,咱們就能夠嘗試去校驗用戶是否存在,這裏auth模塊給咱們封裝了一個好用的方法authenticate(),該方法能夠幫助咱們完成用戶登陸時候和數據庫裏數據的校驗加密
# 校驗用戶是否存在,關鍵字authenticate from django.contrib impport auth user_obj = auth.authenticate(username=username,password=password) # 這裏傳入帳號和密碼就能夠校驗了,若是用戶存在返回的就是該用戶對象,咱們能夠用點的方式進行取值,若是該用戶不存在在數據庫裏,會返回一個None # 保存用戶登陸狀態,關鍵字login auth.login(request,user_obj) # 這個語句真正完成了用戶的登陸操做,即在此語句以後,咱們就能夠用request.user來獲取到登陸的用戶對象 # 清除用戶登陸狀態,關鍵字logout(request) from django.contrib.auth import logout logout(request) # 這裏直接把一個HTTPresponse對象傳進去便可,沒有返回值,會清空該請求的session信息,即使該用戶以前不存在也不會報錯 # 校驗用戶是否登陸,關鍵字is_authenticate request.user.is_authenticated() # 若是已登陸返回True,若是沒登陸返回False
校驗用戶密碼和設置新密碼url
校驗用戶密碼和設置新密碼的前提都是是用戶已登陸,這點要注意code
# 校驗用戶密碼,check_password from django.contrib impport auth request.user.check_password(old_password) # 若是密碼正確返回True,不然返回False # 設置用戶新密碼,set_password request.user.set_password(new_password) request.user.save() # 這裏注意設置完以後必定要保存,否則密碼修改不會成功
auth裝飾器的實現
在以前咱們寫登陸註冊和其他的一些功能的時候,咱們會在哪些須要登錄過才能使用的功能上面加上裝飾器,即確保是已經登陸的用戶才能進行這些擦歐洲哦,不然就會直接跳到登陸界面.
因此無比強大的django直接幫咱們封裝了這麼一個裝飾器,咱們不須要本身手寫裝飾器,直接調用便可.
# 首先咱們導入該方法,而後直接在須要加裝飾器的上面添加便可 from django.contrib.auth.decorators import login_required @login_required def home(request): pass # 實際上,在實際生活中,咱們會碰到這樣一種情景,就是咱們點擊一個頁面A,而後網站會告訴咱們須要先登陸才能操做,而後會直接跳到登陸界面,這個功能在這個裝飾器裏面也能夠實現,兩種方法,局部配置和全局配置 ''' 1. 局部配置,咱們能夠在@login_required(login_url='/home/')裝飾器後面的括號裏面直接添加要跳轉的網址,這樣在調用這個方法的時候若是沒有登錄過就會跳轉到咱們設置的這個網址 2. 全局配置,顧名思義,全局配置以後咱們全部加裝飾器的的方法在沒有登陸的狀況下調用的時候都會跳到這個網址,很是簡單 ''' # 咱們只須要在settings.py裏面添加如下語句,就會應用到全局配置了,這樣咱們的每一個裝飾器後面括號裏就不用再重複添加跳轉地址了 LOGIN_URL = '/home/'
雖然django自帶的auth模塊很是的好用,自動建立表也很是的方便,可是仍是會有一個問題,就是他默認建立的這個auth_user表咱們並不能手動對其進行操做,即咱們沒有辦法對其進行字段的增長,這對於後期項目的更新和修改是很是不利的,因此咱們要想辦法,怎麼才能既可使用auth簡便的功能,又能夠對其表內的字段進行修改呢?
沒錯,就是你想的那樣,繼承!
咱們自定義一個類,繼承自auth_user的父類AbstractUser,而後告訴django新建表的時候用咱們本身建的表來替代auth_user表就能夠了,是否是很強大~~~~?~!~!~!~
下面就是具體執行的過程
# 首先咱們導入響應的模塊 from django.db import models from django.contrib.auth.models import AbstractUser # 開始自定義表類 class UserInfo(AbstractUser): # 這裏咱們只須要寫本身想要添加的新字段就能夠了,本來auth_user有的字段不能重複定義,也不能修改,好比咱們添加一個日期字段,記錄咱們數據添加進去的時間 DataField(auto_now_add=True) # 在配置完以上表類以後,咱們還須要在settings.py配置文件裏面指定 AUTH_USER_MODEL='應用名.表名' # 這是一個固定語法,後面引號內直接用應用名點表名便可,沒必要在乎中間通過了哪些文件夾或者文件