from django.contrib import authhtml
django.contrib.auth中提供了許多方法,這裏主要介紹其中的三個。ajax
驗證用戶輸入的用戶名和密碼是否相同算法
提供了用戶認證,即驗證用戶名以及密碼是否正確,通常須要username password兩個關鍵字參數數據庫
若是認證信息有效,會返回一個 User 對象。authenticate()會在User 對象上設置一個屬性標識那種認證後端認證了該用戶,且該信息在後面的登陸過程當中是須要的。當咱們試圖登錄一個從數據庫中直接取出來不通過authenticate()的User對象會報錯的。django
user = authenticate(username='someone',password='somepassword')後端
該函數接受一個HttpRequest對象,以及一個認證了的User對象cookie
此函數使用django的session框架給某個已認證的用戶附加上session id等信息。session
# 登陸例子的視圖函數:框架
from django.contrib.auth import authenticate, login函數
def login(request):
# 經過auth組件實現
if request.method == "GET":
return render(request, "login.html")
elif request.method == "POST":
username = request.POST.get("username")
password = request.POST.get("pwd")
valid_num = request.POST.get("valid_num")
# 驗證填寫驗證碼的正確性
keep_str = request.session.get("keep_str")
if keep_str.upper() == valid_num.upper():
user = auth.authenticate(username=username, password=password)
# 驗證用戶名和密碼
if user:
# 若是認證成功,就讓登陸,這個login裏面包括了session操做和cookie
auth.login(request, user)
return redirect("/index/")
else:
return render(request, "login.html", {"error": "有錯誤"})
else:
return render(request, "login.html", {"error": "驗證碼輸入錯誤"})
else:
return render(request, "login.html", {"error": "有錯誤"})
3.logout(request) 註銷用戶
該函數接受一個HttpRequest對象,無返回值。當調用該函數時,當前請求的session信息會所有清除。該用戶即便沒有登陸,使用該函數也不會報錯。
from django.contrib.auth import logout
# 退出登陸
def logout(request):
logout(request)
# request.session.flush() #session方法退出,步驟一
rep = redirect("/login/") # 退出返回登陸頁面
# rep.delete_cookie("is_login") # session方法退出,步驟二
return rep
User 對象屬性:username, password(必填項)password用哈希算法保存到數據庫
is_staff : 用戶是否擁有網站的管理權限.
is_active : 是否容許用戶登陸, 設置爲``False``,能夠不用刪除用戶來禁止 用戶登陸
使用 create_user 輔助函數建立用戶分三種建立方式:
(1)create:
建立一個普通用戶,密碼是明文的.(通常不推薦使用,由於沒法結合auth組件的使用)
(2) create_user:
建立一個普通用戶,密碼是密文的.
(3)create_superuser:
建立一個超級用戶,密碼是密文的,要多傳一個email參數.
例:下面用上面上中方式建立了三個用戶和設置密碼
而後對數據庫中的auth_user 進行查詢:
經過如上數據能夠得出:
方式一:密碼爲明文,方式二:密碼爲密文,方式三:密碼爲密文,並且須要填寫郵箱,並且在是否爲super用戶字段處的值爲:1。
用戶須要修改密碼的時候 首先要讓他輸入原來的密碼 ,若是給定的字符串經過了密碼檢查,返回 True
from django.contrib.auth.models import User
user = User.objects.get(username='')
user.set_password(password='')
user.save
要求:
(1)用戶登陸後才能訪問某些頁面
(2)若是用戶沒有登陸就訪問該頁面的話直接跳轉登陸頁面
(3)用戶在跳轉的登陸界面中完成登陸後,自動訪問跳轉到以前訪問的地址
注意:下面兩個方法是用於到登陸頁以前的網頁的判斷。
方法一:本身寫的裝飾器
# 本身寫的裝飾器
def login_required(func):
def inner(request, *args, **kwargs):
if not request.user.is_authenticated: # 沒有登陸成功
path = request.path
return redirect('/login/?next=%s' % path)
ret = func(request, *args, **kwargs)
return ret
return inner
方法二:django已經爲咱們設計好了一個用於此種狀況的裝飾器:login_requierd()
from django.contrib.auth.decorators import login_required
@login_required
def my_view(request):
...
若用戶沒有登陸,則會跳轉到django默認的 登陸URL '/accounts/login/ ' (這個值能夠在settings文件中經過LOGIN_URL進行修改)。並傳遞 當前訪問url的絕對路徑 (登錄成功後,會重定向到該路徑)。
# 登陸函數
def login(request):
# 經過auth組件實現
if request.method == "GET":
return render(request, "login.html")
elif request.method == "POST":
username = request.POST.get("username")
password = request.POST.get("pwd")
valid_num = request.POST.get("valid_num")
# 驗證填寫驗證碼的正確性
keep_str = request.session.get("keep_str")
if keep_str.upper() == valid_num.upper():
user = auth.authenticate(username=username, password=password) # 驗證用戶名和密碼
if user:
# if not request.user.is_authenticated():
# 若是認證成功,就讓登陸,這個login裏面包括了session操做和cookie
auth.login(request, user)
# 路徑爲上一個路徑或者返回一個主頁,這裏的book_list能夠爲主頁的路徑通常名爲:index
path = request.GET.get("next") or "/book_list/"
return redirect(path)
else:
return render(request, "login.html", {"error": "有錯誤"})
else:
return render(request, "login.html", {"error": "驗證碼輸入錯誤"})
else:
return render(request, "login.html", {"error": "有錯誤"})
from django.contrib.auth.models import User
# 註冊及驗證
def register(request):
if request.method == "GET":
form = UserInfoForm() # 初始化form對象
return render(request, "register.html", {"form": form})
if request.is_ajax():
ret = {"status": 1, "msg": None}
print(request.POST)
form = UserInfoForm(request.POST)
if form.is_valid():
print(form.cleaned_data)
data = form.cleaned_data # 效驗經過的數據,是字典的類型數據
# 須要刪除字典中驗證密碼,不須要保存到數據庫中
data.pop("cf_password")
User.objects.create_user(**data) # User是以個對象
print(data)
else:
print(form.errors)
ret['status'] = 0
ret['msg'] = form.errors
return JsonResponse(ret)
# 修改密碼
@login_required #內置驗證是不是登陸狀態的裝飾器
def change_pwd(request):
if request.method == "POST":
oldpassword = request.POST.get("oldpassword", "")
newpassword = request.POST.get("newpassword", "")
# 獲得當前登陸的用戶,判斷舊密碼是否是和當前的密碼同樣
username = request.user # 打印的是當前登陸的用戶名
user = User.objects.get(username=username) # 查看用戶
print(user)
ret = user.check_password(oldpassword) # 檢查密碼是否正確
print(ret)
if ret:
user.set_password(newpassword) # 若是正確就給設置一個新密碼
user.save() # 保存
return redirect("/login/")
else:
info = "輸入密碼有誤"
return render(request, "change_pwd.html", {"info": info})
return render(request, "change_pwd.html")
from django.contrib.auth import logout
# 退出登陸
def logout_user(request):
logout(request)
rep = redirect("/login/")
return rep