1.用戶登錄
Django 中實現(xiàn)用戶的登錄需要兩個方法:authenticate(username, password)
和 login(request, user)
胰舆,它們位于 django.contrib.auth
模塊中。
authenticate(username, password)
函數(shù)需要兩個參數(shù)username
、password
,如果校驗通過則返回 User 對象挽放,如果校驗不通過返回 None泡嘴。login(request,user)
接受兩個參數(shù),第一個是 request 對象吟税,第二個是 user 對象。login 方法使用 SessionMiddleware 將 userID 存入 session 當中姿现。
# 用戶模型
from django.contrib.auth.models import User
# 用戶驗證模塊
from django.contrib.auth import authenticate, login
# 用戶登錄
def user_login(request):
username = 'diego'
password = '12345678xxxxxx'
# 驗證用戶名和密碼是否匹配
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
# 登錄該用戶
login(request, user)
return HttpResponse('你已成功登錄')
else:
return HttpResponse('沒有該用戶或密碼錯誤')
else:
return HttpResponse('沒有該用戶或密碼錯誤')
2.用戶登出
我們使用 django.contrib.auth.logout
方法來登出用 django.contrib.auth.login
函數(shù)登入的用戶肠仪。
使用 logout(requet)
函數(shù)登出用戶,該函數(shù)只有一個參數(shù)备典,就是 request异旧。沒有返回值,而且即使當前用戶沒有登陸也不會拋出任何異常提佣。
# 用戶登出模塊
from django.contrib.auth import logout
# 用戶登出
def user_logout(request):
logout(request)
# 這里可以使用重定向到所需的頁面
3.獲取當前用戶
在 view 中吮蛹,我們可以使用 request.user
獲取當前的登陸用戶 User 對象。如果當前用戶沒有登陸拌屏,那么 request.user
將返回 AnonymousUser
對象潮针。獲取了 User 對象之后,我們就可以對該對象執(zhí)行某些方法或獲取其屬性:
>>> print(request.user)
diego
# 獲取用戶名
>>> print(request.user.username)
diego
# 判斷是否存在登錄用戶
>>> print(request.user.is_authenticated())
True
4.login_required
login_required()
裝飾器函數(shù)做了以下事情:
如果當前用戶沒有登陸倚喂,跳轉(zhuǎn)到
settings.LOGIN_URL
每篷,并傳遞當前的絕對路徑到 URL 請求參數(shù)中,例如:/accounts/login/?next=/polls/3/
如果當前用戶已經(jīng)登陸了,執(zhí)行 view 方法焦读。在 view 中的方法可以認為當前用戶已經(jīng)登陸了子库。
login_required()
方法接受兩個參數(shù):
redirect_field_name
:默認值是 next。用來定義登陸成功之后的跳回之前訪問界面的 url矗晃,如果不想出現(xiàn)默認值仑嗅,設(shè)置為空值即可。login_url
:默認值是settings.LOGIN_URL
张症。用來指定登陸界面的 url仓技。如果不傳入改參數(shù),就需要確保settings.LOGIN_URL
的值是正確設(shè)置的俗他。
現(xiàn)在網(wǎng)站有一個用戶個人頁面浑彰,只給當前登錄的用戶瀏覽,未登錄用戶訪問這個頁面則會跳轉(zhuǎn)到登錄頁拯辙,要實現(xiàn)該效果可以這樣:
# 需要登錄模塊,某個頁面如果需要用戶登錄后才能瀏覽就需要用到該模塊
from django.contrib.auth.decorators import login_required
# 用戶個人頁面
# 如果未登錄用戶訪問該頁面則會跳轉(zhuǎn)到 user_login 頁
@login_required(login_url='user_login', redirect_field_name='')
def user_info(request):
context = {}
user = request.user
context['user'] = user
return render(request, 'user_info.html', context)