我的網站: lipeiguan.top
之後會慢慢轉移到我的網站, 歡迎你們收藏^ . ^html
咱們在開發一個網站的時候, 常常須要實現網站的用戶系統. 這個時候咱們須要實現用戶註冊、用戶登陸、用戶認證、註銷、修改密碼等一系列功能. 若是咱們都是本身實現的話, 不是不能夠, 只是有些浪費時間.
而Django則內置了一個用戶認證系統 --> auth, 它默認使用 auth_user表來儲存用戶的數據.
那麼接下來就來了解一下這個強大的用戶認證系統.python
要使用這個模塊, 就須要先導入它.數據庫
from django.contrib import auth
該函數提供了用戶認證功能, 通常須要username、password兩個關鍵字參數.
若是用戶名和密碼正確, 則會返回一個User對象, authenticate()會在該User對象上設置一個屬性來標識後端已經認證了該用戶, 並且該信息在後續的登陸過程當中是須要的.
具體用法:django
user = auth.authenticate(request, username="username", password="password")
該函數接受一個HttpRequest對象, 以及一個通過認證的User對象.
主要實現了一個用戶登陸的功能, 它會在後端爲該用戶生成相關的session數據.
具體用法:後端
from django.shortcuts import render, redirect from django.contrib import auth def my_login(request): if request.method == "POST": username = request.POST.get("username") password = request.POST.get("password") user = auth.authenticate(request, username=username, password=password) if user: auth.login(request, user) # Redirect to a success page. else: # Return an "invalid login" error message. return render(request, "login.html")
該函數接受一個HttpRequest對象, 無返回值.
當調用該函數時, 當前請求的session信息會所有清除. 該用戶即便沒有登陸, 使用該函數也不會報錯.
具體用法:session
from django.authenticate import auth def logout(request): auth.logout(request) # Redirect to a success page. return redirect('/login/')
若是一個頁面須要登陸才能訪問, 一個用戶在沒有登陸的狀況下就訪問該頁面的話就會直接跳轉到登陸頁面, 以後在完成登陸以後, 會自動訪問跳轉以前的頁面.
具體用法:app
def login(request): if not request.user.is_authenticated(); return redirect("%s?next=%s" % (settings.LOGIN_URL, requedt.path))
Django也爲咱們設計好了一個用於該狀況的裝飾器. 見 login_required()函數
auth給咱們提供了一個裝飾器工具, 用來快捷的給某個視圖添加登陸校驗.
具體用法:工具
from django.contrib.auth.decorators import login_required @login_required def index(request): ...
若用戶沒有登陸, 則會跳轉到Django默認的登陸URL: 'accounts/login', 並傳遞當前訪問URL的絕對路徑(登陸成功後, 會重定向到該路徑).網站
固然, 咱們能夠自定義登陸的URL, 在settings.py文件中添加以下代碼
LOGIN_URL = '/login/'
auth提供的一個建立新用戶的方法, 須要提供必要參數(username、password)等.
具體用法:
from django.contrib.auth.models import User user = User.objects.create_user(username="用戶名", password="密碼", email="郵箱(能夠爲空)", ...)
auth提供一個建立新的超級用戶的方法, 須要提供必要參數(username, password)等.
具體用法:
from django.contrib.auth.models import User user = User.objects.create_superuser(username="用戶名", password="密碼", email="郵箱", ...)
auth提供一個檢查密碼是否正確的方法, 須要提供當前請求用戶的密碼.
好比當用戶須要修改密碼時, 要輸入原來的密碼, 若是輸入的字符串經過了密碼檢查, 則返回 True, 不然返回 False.
具體用法:
ok = request.user.check_password("密碼")
auth提供的一個修改密碼的方法, 接收 要設置的新密碼 做爲參數.
注意: 設置完必定要調用用戶對象的save方法!!!
具體用法:
request.user.set_password("密碼") request.user.save()
登陸:
def login(request): if request.method == "POST": username = request.POST.get("username") password = request.POST.get("password") user_obj = auth.authenticate(request, username=username, password=password) if user_obj: # 記錄登陸狀態 auth.login(request, user_obj) next = request.GET.get("next") if next: return redirect(next) return redirect('/index/') return render(request, "login.html")
修改密碼:
@login_required def set_password(request): user = request.user error_message = "" 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: error_message = "新密碼不能爲空" elif new_password != repeat_password: error_message = "兩次密碼不一致" else: user.set_password(new_password) user.save() return redirect('/login/') else: error_message = "原密碼輸入有誤" return render(request, "set_password.html", {"error_message": erroe_message}) return render(request, "set_password.html")
註冊:
def reg(request): error_message = "" if request.method == "POST": username = request.POST.get("username") password = request.POST.get("password") repeat_password = request.POST.get("repeat_password") if password: if password != repeat_password: error_message = "密碼輸入不一致" else: User.objects.create_user(username=username, password=password) return redirect('/login/') else: error_message = "密碼不能爲空" return render(request, "reg.html")
註銷:
def logout(request): auth.logout(request) return redirect('/login/')
date_joined
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
注意:
只是按照上面的方式擴展了內置的auth_user表以後還不夠, 還須要在settings.py文件中告訴Django, 我如今使用我定義的UserInfo表來作用戶認證.
在settings.py中添加以下代碼:
# 引用Django自帶的User表, 繼承時須要設置 AUTH_USER_MODEL = "app名.UserInfo"
注意: 一旦咱們指定了新的認證系統所使用的表, 就須要從新在數據庫中建立表, 而不能繼續使用原來默認的auth_user表了.