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"