生成數據庫html
查看 auth_user 數據庫python
給 auth_user 表建立一個超級用戶數據庫
郵箱地址能夠不寫django
再看一下 auth_user 表後端
密碼被加密了session
login.html:函數
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登陸頁面</title> </head> <body> <form action="/login/" method="post"> {% csrf_token %} <p> 用戶名: <input type="text" name="username"> </p> <p> 密碼: <input type="password" name="password"> </p> <p> <input type="submit" value="登陸"> </p> </form> </body> </html>
該方法是用戶認證功能,能夠驗證用戶名和密碼是否正確post
若是認證成功,會返回一個 User 對象;若是認證失敗,會返回一個匿名對象ui
authenticate() 會在該 User 對象上設置一個屬性來標識後端已經認證了該用戶,且該信息在後續的登陸過程當中是須要的加密
views.py:
from django.shortcuts import render, redirect from django.contrib import auth def login(request): if request.method == "POST": username = request.POST.get("username") password = request.POST.get("password") # 判斷用戶名密碼是否有效 user = auth.authenticate(username=username, password=password) if user: # 若是用戶名密碼有效 return redirect("/index/") return render(request, "login.html") def index(request): return render(request, "index.html")
訪問,http://127.0.0.1:8000/login/
輸入 admin,admin123
驗證成功
該函數接受一個 HttpRequest 對象,以及一個通過認證的 User 對象
該函數實現一個用戶登陸的功能,它本質上會在後端爲該用戶生成相關 session 數據
views.py:
from django.shortcuts import render, redirect from django.contrib import auth def login(request): if request.method == "POST": username = request.POST.get("username") password = request.POST.get("password") # 判斷用戶名密碼是否有效 user = auth.authenticate(username=username, password=password) # 將登陸的用戶封裝到 request.user auth.login(request, user) if user: # 若是用戶名密碼有效 return redirect("/index/") return render(request, "login.html") def index(request): print(request.user.username) # 獲取到封裝的 request.user 的 username print(request.user.password) # 獲取到封裝的 request.user 的 password return render(request, "index.html")
訪問,http://127.0.0.1:8000/login/
輸入 admin,admin123
驗證成功
看一下執行結果:
獲得的密碼是加密後的
當調用該函數時,當前請求的 session 信息會所有被清除
若是沒有登陸信息,使用該函數也不會報錯
views.py:
from django.shortcuts import render, redirect from django.contrib import auth def login(request): if request.method == "POST": username = request.POST.get("username") password = request.POST.get("password") # 判斷用戶名密碼是否有效 user = auth.authenticate(username=username, password=password) # 將登陸的用戶封裝到 request.user auth.login(request, user) if user: # 若是用戶名密碼有效 return redirect("/index/") return render(request, "login.html") def index(request): print(request.user.username) # 獲取到封裝的 request.user 的 username print(request.user.password) # 獲取到封裝的 request.user 的 password return render(request, "index.html") def logout(request): auth.logout(request) return redirect("/login/")
index.html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>index 頁面</title> </head> <body> <h1>這裏是 index 頁面</h1> <a href="/logout/">註銷</a> </body> </html>
訪問,http://127.0.0.1:8000/login/
輸入 admin,admin123
點擊「註銷」
跳轉到登陸頁面
該方法用來判斷當前請求是否經過了認證
views.py:
from django.shortcuts import render, redirect from django.contrib import auth def login(request): if request.method == "POST": username = request.POST.get("username") password = request.POST.get("password") # 判斷用戶名密碼是否有效 user = auth.authenticate(username=username, password=password) # 將登陸的用戶封裝到 request.user auth.login(request, user) if user: # 若是用戶名密碼有效 return redirect("/index/") return render(request, "login.html") def index(request): print(request.user.username) # 獲取到封裝的 request.user 的 username print(request.user.password) # 獲取到封裝的 request.user 的 password ret = request.user.is_authenticated() # 判斷是否經過了認證 print(ret) return render(request, "index.html") def logout(request): auth.logout(request) return redirect("/login/")
訪問,http://127.0.0.1:8000/login/
輸入 admin,admin123
該方法能夠給視圖函數添加登陸校驗
若是用戶沒有登陸,則會跳轉到 django 默認的登陸 URL 「/accounts/login/」,並傳遞當前訪問 url 的絕對路徑(登錄成功後,會重定向到該路徑)
views.py:
from django.shortcuts import render, redirect from django.contrib import auth from django.contrib.auth.decorators import login_required def login(request): if request.method == "POST": username = request.POST.get("username") password = request.POST.get("password") # 判斷用戶名密碼是否有效 user = auth.authenticate(username=username, password=password) # 將登陸的用戶封裝到 request.user auth.login(request, user) if user: # 若是用戶名密碼有效 return redirect("/index/") return render(request, "login.html") @login_required def index(request): return render(request, "index.html")
訪問,http://127.0.0.1:8000/index/
由於不存在 /account/login/ 目錄
若是須要自定義登陸的 URL,能夠在 settings.py 中經過 LOGIN_URL 進行修改
訪問,http://127.0.0.1:8000/index/
該方法用於建立一個新的用戶
views.py:
from django.shortcuts import HttpResponse from django.contrib.auth.models import User def reg(request): User.objects.create_user(username="test", password="test") # 建立新用戶 return HttpResponse("註冊成功!")
訪問,http://127.0.0.1:8000/reg/
查看 auth_user 表
添加成功
該方法用於建立超級用戶
views.py:
from django.shortcuts import HttpResponse from django.contrib.auth.models import User def reg(request): User.objects.create_superuser(username="root", password="root123", email="") # 建立新的超級用戶 return HttpResponse("註冊成功!")
訪問,http://127.0.0.1:8000/reg/
查看 auth_user 表
成功建立超級用戶
該方法檢查密碼是否正確的,須要提供當前請求用戶的密碼
密碼正確返回 True,不然返回 False
views.py:
from django.shortcuts import render, redirect from django.contrib import auth def login(request): if request.method == "POST": username = request.POST.get("username") password = request.POST.get("password") # 判斷用戶名密碼是否有效 user = auth.authenticate(username=username, password=password) # 將登陸的用戶封裝到 request.user auth.login(request, user) if user: # 若是用戶名密碼有效 return redirect("/index/") return render(request, "login.html") def index(request): ret = request.user.check_password(raw_password="aaa") # 檢查密碼是不是 aaa print(ret) return render(request, "index.html")
訪問,http://127.0.0.1:8000/login/
輸入 admin,admin123
運行結果:
該方法用來修改密碼
views.py:
from django.shortcuts import HttpResponse from django.contrib.auth.models import User def reg(request): user_obj = User.objects.create_user(username="test1", password="test") # 建立新用戶 user_obj.set_password("root") # 設置新密碼 user_obj.save() # 保存設置的新密碼 return HttpResponse("註冊成功!")
新建立的用戶 test1 的密碼爲 root,而不是 test
這裏須要用 save 將設置的新密碼保存