auth是django提供的權限管理系統,可以提供用戶身份認證,用戶組合權限管理。
登錄認證:
登錄的視圖函數:
def login_auth(request): if request.method == "GET": return render(request, "login.html", context={"new_time": new_time}) if request.method == "POST": username = request.POST.get("username") password = request.POST.get("password") print("用戶名:{},密碼:{}".format(username, password)) # todo user認證成功返回對象,認證失敗返回空 user = authenticate(username=username, password=password) if user: if user.is_active: # 判斷用戶是否有效 login(request, user=user) # 登錄 request.session["user"] = username # 加session request.session.set_expiry(None) # 設置session有效期:0為關閉瀏覽器馬上失效,none為永久 result = {"code": 0, "msg": "login success!", "data": {"username": username, "password": password, } } # return JsonResponse(result) return HttpResponseRedirect("/info/") else: # return redirect('/login') return render(request, "login.html", context={"msg": "用戶名或密碼錯誤"})
登錄的html:
<!DOCTYPE html> <html lang="en"> <head> <title>登陸接口</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> </head> <body> <h3 align="center">登錄頁面</h3> <p align="center">{{ new_time }}</p> <form action="" method="post"> <table align="center"> <tr> <td>用戶名</td> <td> <input type="text" name="username" /> </td> </tr> <tr> <td>密碼</td> <td> <input type="text" name="password"/> </td> <p style="color: red" align="center"> {{msg}} </p> <tr> <td> <input type="submit" value="登錄"> </td> </tr> </table> </form> </body> </html>
顯示效果:
注冊認證:
注冊的視圖函數:
def register(request): if request.method == "GET": return render(request, "register.html", context={"new_time": new_time}) if request.method == "POST": register_name = request.POST.get("registername") register_pwd = request.POST.get("registerpwd") print("獲取到用戶輸入的用戶名是:{}密碼是:{}".format(register_name, register_pwd)) # 通過用戶名判斷查詢賬號是否已經注冊 user_list = User.objects.filter(username=register_name) if user_list: data = { "msg": "account already exists!" } return render(request, "register.html", context=data) elif len(register_pwd) < 6: return render(request, "register.html", context={"msg": "密碼長度必須大於等於6位"}) elif register_name.strip() != '' and register_pwd.strip() != '': user = User.objects.create_user(username=register_name, password=register_pwd) regist_result = { "code": 0, "msg": "register success!", "data": { "register_name": register_name, "register_pwd": register_pwd, } } user.save() return JsonResponse(regist_result) else: data = {"msg": "not null!"} return render(request, "register.html", context=data)
注冊的html:
<!DOCTYPE html> <html lang="en"> <head> <title>注冊接口</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> </head> <body> <h3 align="center">注冊頁面</h3> <p align="center">{{ new_time }}</p> <form action="" method="post"> <table align="center"> <tr> <td>請輸入用戶名</td> <td> <input type="text" name="registername" /> </td> </tr> <tr> <td>請輸入密碼</td> <td> <input type="text" name="registerpwd"/> </td> </tr> <p style="color: red" align="center"> {{msg}} </p> <tr> <td> <input type="submit" value="注冊"> </td> </tr> </table> </form> </body> </html>
顯示效果:
修改密碼:
修改密碼的視圖函數:
@login_required
def updata_pwd(request):
if request.method == "GET":
return render(request, "updata.html", context={"new_time": new_time})
if request.method == "POST":
# username = request.POST.get("username")
password = request.POST.get("password")
new_password = request.POST.get("new_password")
username = request.user.username # 獲取當前登錄用戶的用戶名
user = authenticate(username=username,
password=password)
print("當前用戶登錄名是:{}".format(username))
if not user:
# todo 如果用戶沒在user中,證明登錄失敗,修改密碼先判斷登錄成功,再去修改密碼
return render(request, "updata.html", context={"msg": "原密碼錯誤,請重新輸入"})
else:
user.set_password(new_password) # 重置密碼
user.save() # todo 一定要保存才會生效
return render(request, "updata.html", context={"msg": "密碼修改成功"})
修改密碼的html:
<!DOCTYPE html> <html lang="en"> <head> <title>注冊接口</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> </head> <body> <h3 align="center">注冊頁面</h3> <p align="center">{{ new_time }}</p> <form action="" method="post"> <table align="center"> <tr> <td>請輸入用戶名</td> <td> <input type="text" name="registername" /> </td> </tr> <tr> <td>請輸入密碼</td> <td> <input type="text" name="registerpwd"/> </td> </tr> <p style="color: red" align="center"> {{msg}} </p> <tr> <td> <input type="submit" value="注冊"> </td> </tr> </table> </form> </body> </html>
全部視圖代碼:
from django.shortcuts import render, redirect from django.http import HttpResponse, JsonResponse, HttpResponseRedirect from Hello_Api.models import Register from django.contrib.auth.models import User from django.contrib.auth import authenticate, login from django.contrib.auth.decorators import login_required import datetime # Create your views here. new_time = datetime.datetime.now() @login_required def personinfo(request): context = { "blog_name": "圓覺", "username": "夏", "age": 23, "fancy": ["python", "django", "requests"], "blog": {"url": "https://www.cnblogs.com/xiamaojjie/", "img": "https://pic.cnblogs.com/avatar/1772245/20191102152106.png", } } class Myblog(): def __init__(self): self.guangzhu = 3 self.fensi = 8 def guangzhu(self): return self.guangzhu def fensi(self): return self.fensi myblog = Myblog() # TODO 實例化對象 context["myblog"] = myblog # TODO 把對象添加到字典里面,通過類名.取值 return render(request, "personinfo.html", context) def register(request): if request.method == "GET": return render(request, "register.html", context={"new_time": new_time}) if request.method == "POST": register_name = request.POST.get("registername") register_pwd = request.POST.get("registerpwd") print("獲取到用戶輸入的用戶名是:{}密碼是:{}".format(register_name, register_pwd)) # 通過用戶名判斷查詢賬號是否已經注冊 user_list = User.objects.filter(username=register_name) if user_list: data = { "msg": "account already exists!" } return render(request, "register.html", context=data) elif len(register_pwd) < 6: return render(request, "register.html", context={"msg": "密碼長度必須大於等於6位"}) elif register_name.strip() != '' and register_pwd.strip() != '': user = User.objects.create_user(username=register_name, password=register_pwd) regist_result = { "code": 0, "msg": "register success!", "data": { "register_name": register_name, "register_pwd": register_pwd, } } user.save() return JsonResponse(regist_result) else: data = {"msg": "not null!"} return render(request, "register.html", context=data) def login_auth(request): if request.method == "GET": return render(request, "login.html", context={"new_time": new_time}) if request.method == "POST": username = request.POST.get("username") password = request.POST.get("password") print("用戶名:{},密碼:{}".format(username, password)) # todo user認證成功返回對象,認證失敗返回空 user = authenticate(username=username, password=password) if user: if user.is_active: # 判斷用戶是否有效 login(request, user=user) # 登錄 request.session["user"] = username # 加session request.session.set_expiry(None) # 設置session有效期:0為關閉瀏覽器馬上失效,none為永久 result = {"code": 0, "msg": "login success!", "data": {"username": username, "password": password, } } # return JsonResponse(result) return HttpResponseRedirect("/info/") else: # return redirect('/login') return render(request, "login.html", context={"msg": "用戶名或密碼錯誤"}) @login_required def updata_pwd(request): if request.method == "GET": return render(request, "updata.html", context={"new_time": new_time}) if request.method == "POST": username = request.POST.get("username") password = request.POST.get("password") new_password = request.POST.get("new_password") user = authenticate(username=username, password=password) if not user: # todo 如果用戶沒在user中,證明登錄失敗,修改密碼先判斷登錄成功,再去修改密碼 return render(request, "updata.html", context={"msg": "原密碼錯誤,請重新輸入"}) else: user.set_password(new_password) # 重置密碼 user.save() # todo 一定要保存才會生效 return render(request, "updata.html", context={"msg": "密碼修改成功"})