Django學習筆記(6-2 使用者登入-2)

mug發表於2021-09-09
  • 兩個login
def login(request):
    ......
    if user is not None:
        #這裡會報錯,因為有兩個login,所以很重要的一點,函式名稱不要和預設名稱一樣。否則就會使用混亂。否則就要寫全路徑
        #這也說明了python的函式可以自己呼叫自己
        login(request,user)
        return render(request,"index.html")
    else:
        return render(request,"login.html")
    ......

改為

def user_login(request):

在session有效期內,即使沒有登陸也會自動登陸

  • 自定義後臺auth的認證方法
    重寫authenticate,以後user_login函式里面的authenticated驗證就是我們自己寫的了,而也不用更改user_login方法
from django.contrib.auth.backends import ModelBackend
from .models import UserProfile

class CustomBackend(ModelBackend):
    def authenticate(self,username=None,password=None,**kwargs):
        try:
            user = UserProfile.objects.get(username=username)
            #password是密文,so,不能password=password,因為使用者輸入的是明文呀
            #userprofile繼承了adstractuser,所以有個check_password方法
            if user.check_password(password):
                return user
            except Exception as e:
                return None
  • 把自定義的驗證邏輯註冊

setting.py

AUTHENTICATION_BACKENDS = (
    ‘users.views.CustomBackend',
       #注意一定要加“,”特別是元組資料的時候
)
  • 讓email也可以登陸
    現在就可以在自定義的au裡面寫點自己的邏輯了
user = UserProfile.objects.get(username=username,)
#,是並集

username和eamil登陸是“或”關係,現在介紹Q

user = UserProfile.objects.get(Q(username=username)|Q(email=username),Q(password=password))
#並非全是並集,而是並集與交集的隨意排版
#把password去掉
user = UserProfile.objects.get(Q(username=username)|Q(email=username))
  • 提示登陸錯誤
def login(request):
    ......
    if user is not None:
        login(request,user)
        return render(request,"index.html")
    else:
        return render(request,"login.html",{"msg":"使用者名稱或密碼錯誤"})
    ......

{{ msg }}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/506/viewspace-2799295/,如需轉載,請註明出處,否則將追究法律責任。

相關文章