auth模塊
一、auth模塊機制
使用auth模塊先導入auth模塊
from django.contrib import auth django.contrib.auth中提供了許多方法
auth模塊是cookie和session的升級版,auth模塊是對登錄認證方法的一種封裝,之前我們獲取用戶輸入的用戶名及密碼后需要自己從user表里查詢有沒有用戶名和密碼符合的對象,而有了auth模塊之后就可以很輕松的去驗證用戶的登錄信息是否存在於數據庫中。除此之外,auth還對session做了一些封裝,方便我們校驗用戶是否已登錄。
用戶登錄后:會在django_session中session id,並且把用戶信儲存起來
二、auth模塊方法
1 、authenticate()
提供了用戶認證,即驗證用戶名以及密碼是否正確,一般需要username password兩個關鍵字參數。如果認證信息有效,會返回一個 User 對象。authenticate()會在User 對象上設置一個屬性標識那種認證后端認證了該用戶,且該信息在后面的登錄過程中是需要的。當我們試圖登陸一個從數據庫中直接取出來不經過authenticate()的User對象會報錯的!
user = authenticate(username='someone',password='somepassword')
2、login(HttpRequest, user)
該函數接受一個HttpRequest對象,以及一個認證了的User對象;此函數使用django的session框架給某個已認證的用戶附加上session id等信息。
def log_in(request): if request.method == "POST": user = request.POST.get("user") pwd = request.POST.get("pwd") # 驗證成功,返回user對象,否則返回None user = auth.authenticate(username=user,password=pwd) if user: auth.login(request,user) #session寫操作 return redirect("/index/") return render(request,"longin.html")
3、logout(request) 注銷用戶
該函數接受一個HttpRequest對象,無返回值。當調用該函數時,當前請求的session信息會全部清除。該用戶即使沒有登錄,使用該函數也不會報錯。
def log_out(request): auth.logout(request) return redirect("/login/")
4 、user對象的 is_authenticated
要求:
1 用戶登陸后才能訪問某些頁面,
2 如果用戶沒有登錄就訪問該頁面的話直接跳到登錄頁面
3 用戶在跳轉的登陸界面中完成登陸后,自動訪問跳轉到之前訪問的地址
方法1: 直接用auth的is_authenticated方法驗證 def my_view(request): if not request.user.is_authenticated: return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path)) 方法2: 根據request.user.username來驗證,如果為空,則說明沒有登錄 def my_view(request): if not request.user.username: return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path)) 方法3: django已經為我們設計好了一個用於此種情況的裝飾器:login_requierd() from django.contrib.auth.decorators import login_required @login_required def my_view(request): ...
若用戶沒有登錄,則會跳轉到django默認的 登錄URL '/accounts/login/ ' (這個值可以在settings文件中通過LOGIN_URL進行修改)。並傳遞 當前訪問url的絕對路徑 (登陸成功后,會重定向到該路徑)。
eg:
def index(request): print(request.user) print(type(request.user)) #方法一 # if not request.user.id: # return redirect("/login/") #方法二 user = request.user if not user.is_authenticated: return redirect("/login/") return render(request,"index.html",locals())