開源web框架django知識總結(十一)
賬號登錄
前端頁面簡介
login.html檔案
@submit.prevent #阻止默認提交
可以使用 v-cloak 指令設定樣式,這些樣式會在 Vue 實體編譯結束時,從系結的 HTML 元素上被移除,
當網路較慢,網頁還在加載 Vue.js ,而導致 Vue 來不及渲染,這時頁面就會顯示出 Vue 源代碼,我們可以使用 v-cloak 指令來解決這一問題,
Vue中使用v-model指令來實作表單元素和資料的雙向系結,監聽用戶的輸入,然后更新資料,
- 因為input中的v-model系結了msg,所以會實時將輸入的內容傳遞給msg , msg發生改變,
- 當msg發生改變時,因為上面使用了插值語法將msg的值插入到DOM中,所以DOM會發生回應的改變,所以通過v-model實作了雙向的系結,
login.js檔案
用戶名登錄
1. 用戶名登錄邏輯分析

2. 用戶名登錄介面設計
1.請求方式
| 選項 | 方案 |
|---|---|
| 請求方法 | POST |
| 請求地址 | /login/ |
2.請求引數:表單
| 引數名 | 型別 | 是否必傳 | 說明 |
|---|---|---|---|
| username | string | 是 | 用戶名 |
| password | string | 是 | 密碼 |
| remembered | string | 是 | 是否記住用戶 |
3.回應結果:HTML
| 欄位 | 說明 |
|---|---|
| 登錄失敗 | 回應錯誤提示 |
| 登錄成功 | 重定向到首頁 |
3. 用戶名登錄介面定義
# 傳統登陸(校驗用戶名和密碼)
class LoginView(View):
def post(self, request):
pass
- 用戶名登錄后端邏輯
import json
import re
from django.contrib.auth import login, authenticate
from django.http import JsonResponse
from django.views import View
from django_redis import get_redis_connection
from .models import User
# Create your views here.
import logging
logger = logging.getLogger('django')
# 傳統登陸(校驗用戶名和密碼)
class LoginView(View):
def post(self, request):
# 1、提取引數
data = json.loads(request.body.decode())
username = data.get('username')
password = data.get('password')
remembered = data.get('remembered')
# 2、校驗引數
if not all([username, password]):
return JsonResponse({'code': 400, 'errmsg': '引數缺失!'})
if not re.match(r'^\w{5,20}$', username):
return JsonResponse({'code':400, 'errmsg': '用戶名格式有誤'}, status=400)
if not re.match(r'^\w{8,20}$', password):
return JsonResponse({'code':400, 'errmsg': '密碼格式有誤'}, status=400)
# 3、資料處理(驗證用戶名和密碼)
# try:
# user = User.objects.get(username=username)
# except User.DoesNotExist as e:
# return JsonResponse({'code': 400, 'errmsg': '用戶名錯誤!'})
# if not user.check_password(password):
# return JsonResponse({'code': 400, 'errmsg': '密碼錯誤!'})
# authenticate():功能、引數、回傳值
# 功能:傳統身份驗證——驗證用戶名和密碼
# 引數:request請求物件,username用戶名和password密碼
# 回傳值:認證成功回傳用戶物件,否則回傳None
user = authenticate(request, username=username, password=password)
if not user:
return JsonResponse({"code": 400, 'errmsg': '您提供的身份資訊無法驗證!'}, status=401)
# 狀態保持
login(request, user)
if remembered:
# 設定session有效期默認2周
request.session.set_expiry(None)
else:
# 設定session有效期為關閉瀏覽器頁面則失效
request.session.set_expiry(0) # 設定為0表示關閉瀏覽器清楚sessionid
# 4、構建回應
response = JsonResponse({'code': 0, 'errmsg': 'ok'})
response.set_cookie(
'username',
username,
max_age=3600 * 24 * 14
)
return response
request.session.set_expiry(value)你可以傳遞四種不同的值給它:
* 如果value是個整數,session會在些秒數后失效,* 如果value是個datatime或timedelta,session就會在這個時間后失效,* 如果value是0,用戶關閉瀏覽器session就會失效,* 如果value是None,session會依賴全域session失效策略,
5. 知識要點
- 登錄的核心思想:認證和狀態保持
- 通過用戶的認證,確定該登錄用戶是阿爾法商場的注冊用戶,
- 通過狀態保持快取用戶的唯一標識資訊,用于后續是否登錄的判斷,
6、users.urls.py
# 用戶名登錄的子路由:
re_path(r'^login/$', LoginView.as_view()),

多賬號登錄
- Django自帶的用戶認證后端默認是使用用戶名實作用戶認證的,
- 用戶認證后端位置:django.contrib.auth.backends.ModelBackend,
- 如果想實作用戶名和手機號都可以認證用戶,就需要自定義用戶認證后端,
- 自定義用戶認證后端步驟
- 在users應用中新建utils.py檔案
- 新建類,繼承自ModelBackend
- 重寫認證authenticate()方法
- 分別使用用戶名和手機號查詢用戶
- 回傳查詢到的用戶實體
1. 自定義用戶認證后端
在apps/users/下,新建utils.py檔案

utils.py內容:
"""
自定義身份認證后端,來實作多賬號登陸
"""
from django.contrib.auth.backends import ModelBackend
from .models import User
class UsernameMobileAuthBackend(ModelBackend):
# 重寫authenticate實力方法,實作多賬號登陸
# 默認ModelBackend只會根據username過濾用戶
def authenticate(self, request, username=None, password=None, **kwargs):
# request: 請求物件
# username: 用戶名或手機號
# password: 密碼
# 1、根據用戶名過濾
try:
user = User.objects.get(username=username)
except User.DoesNotExist as e:
# 2、根據手機號過濾
try:
user = User.objects.get(mobile=username)
except User.DoesNotExist as e:
return None
# 3、其中某一個過濾出用戶,再校驗密碼
if user.check_password(password):
return user
在dev.py中新增:
# 自定義認證后端
AUTHENTICATION_BACKENDS = [
"users.utils.UsernameMobileAuthBackend"
]
退出登錄
1. logout()方法介紹
- 退出登錄:
- 回顧登錄:將通過認證的用戶的唯一標識資訊,寫入到當前session會話中
- 退出登錄:正好和登錄相反(清理session會話資訊)
- logout()方法:
- Django用戶認證系統提供了
logout()方法 - 封裝了清理session的操作,幫助我們快速實作登出一個用戶
- Django用戶認證系統提供了
- logout()位置:
django.contrib.auth.__init__.py檔案中
2. logout()方法使用
from django.contrib.auth import login,logout,authenticate
# 登出
class LogoutView(View):
def delete(self, request):
# 1、獲取用戶物件
# request.user是當前登陸的用戶 或 是一個匿名用戶
# user是用戶模型類物件 或 AnonymousUser匿名用戶物件
# user = request.user
# 2、呼叫logout函式清除用戶session資料
# 通過request物件提取cookie中是sessionid,進一步洗掉redis中的用戶資料
logout(request)
# 3、構建回應
response = JsonResponse({'code':0, 'errmsg': 'ok'})
response.delete_cookie('username')
return response
3. 知識要點
- 退出登錄的核心思想就是清理登錄時快取的狀態保持資訊,
- 由于首頁中用戶名是從cookie中讀取的,所以退出登錄時,需要將cookie中用戶名清除,
4、users.urls.py
# 登出
re_path(r'^logout/$', LogoutView.as_view()),

祝大家學習python順利!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/375911.html
標籤:python
