django登陸驗證

auth模塊

from django.contrib import auth

django.contrib.auth中提供了許多方法。html

主要方法:authenticate()、login(HttpRequest, user)、logout(request)、 is_authenticated()java

 

登陸算法

authenticate():authenticate()會在User 對象上設置一個屬性來標識後端已經認證了該用戶,且該信息在後續的登陸過程當中是須要的。數據庫

login(HttpRequest, user):該函數接受一個HttpRequest對象,以及一個認證了的User對象django

複製代碼
from django.contrib.auth import authenticate, login

def my_view(request):
 # 獲取用戶登陸的信息 username
= request.POST['username'] password = request.POST['password']
 # 調用內置方法,驗證用戶登陸信息
 # 會返回一個User對象 user
= authenticate(username=username, password=password)
 # 判斷用戶是否存在
if user is not None:
  # 內置的login方法
  # 1. 生成Session數據,存一下user_id 而後把sessionid寫入Cookie
  # 2. 後續每一次請求來的時候,AuthenticationMiddleware中的process_request方法中
  # 會取到user_id,進而取到user對象,而後添加到request.user屬性中 --> request.user = user
  # 後續咱們均可以經過request.user拿到當前的登錄用戶對象
login(request, user)
# Redirect to a success page. ... else: # Return an 'invalid login' error message. ...
複製代碼

注意:關鍵內容都在註釋裏後端

 

註冊用戶session

使用 create_user()輔助函數建立用戶app

複製代碼
def reg(request):
if request.method == "POST":
username = request.POST.get("username")
pwd = request.POST.get("pwd")
# 建立用戶
# User.objects.create(username=username, password=pwd)
# 調用內置的建立普通用戶的專用方法,建立一個新的用戶
User.objects.create_user(username=username, password=pwd)

return render(request, "reg.html")
複製代碼

 

註銷用戶ide

logout(request):該函數接受一個HttpRequest對象,無返回值。調用該函數,當前請求的session信息,所有清除。

from django.contrib.auth import logout

def logout_view(request):
logout(request)
# Redirect to a success page.

 

User對象

User 對象屬性:username, password(必填項)password用哈希算法保存到數據庫
is_staff : 用戶是否擁有網站的管理權限.
is_active : 是否容許用戶登陸, 設置爲``False``,能夠不用刪除用戶來禁止 用戶登陸

 

user對象的 is_authenticated()

要求: 1 用戶登錄後才能訪問某些頁面,
2 若是用戶沒有登陸就訪問該頁面的話直接跳到登陸頁面
3 用戶在跳轉的登錄界面中完成登錄後,自動訪問跳轉到以前訪問的地址

方法一:

def my_view(request):
if not request.user.is_authenticated():
return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

方法二:

django已經爲咱們設計好了一個用於此種狀況的裝飾器:login_requierd()

from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
...

若用戶沒有登陸,則會跳轉到django默認的 登陸URL '/accounts/login/ ' (這個值能夠在settings.py文件中經過LOGIN_URL進行修改)。並傳遞  當前訪問url的絕對路徑 (登錄成功後,會重定向到該路徑)。

 

建立用戶

使用 create_user 輔助函數建立用戶:

from django.contrib.auth.models import User user = User.objects.create_user(username='',password='',email='')

驗證密碼

check_password(password) # 用戶須要修改密碼的時候,首先要讓其輸入原來的密碼 ,若是給定的值經過了密碼檢查,返回 True

修改密碼

使用 set_password() 來修改密碼

user = User.objects.get(username='')
user.set_password(password='')
user.save()  # 這一步很重要,將咱們的修改同步到數據庫中

示例

複製代碼
@login_required
def set_password(request):
user = request.user
err_msg = ''
if request.method == 'POST':
old_password = request.POST.get('old_password', '')
new_password = request.POST.get('new_password', '')
repeat_password = request.POST.get('repeat_password', '')
# 檢查舊密碼是否正確
if user.check_password(old_password):
if not new_password:
err_msg = '新密碼不能爲空'
elif new_password != repeat_password:
err_msg = '兩次密碼不一致'
else:
user.set_password(new_password)
user.save()
return redirect("/login/")
else:
err_msg = '原密碼輸入錯誤'
content = {
'err_msg': err_msg,
}
return render(request, 'set_password.html', content)

修改密碼示例
複製代碼

 

自定義auth_user表(進階)

內置的author_user表當然好用,但不夠靈活,在咱們本身的項目中沒法直接只用。(例如:表中我想要添加本身的一些字段(phone),這個時候問題就來了,沒法添加。)

解決辦法:

方式一:新建另一張表,經過一對一與內置的auth_user表關聯(我的不推薦)

方式二:自定義model類,繼承auth_user表對應的類,在settings.py中配置AUTH_USER_MODEL

示例

複製代碼
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
複製代碼

注意:

自定義user表後,咱們須要將配置更新到Django中,這樣Django才能知道用哪張表作用戶認證

settings.py

# 引用Django自帶的User表,繼承使用時須要設置 AUTH_USER_MODEL = "app名.UserInfo"
相關文章
相關標籤/搜索