首先,咱們須要進行業務邏輯分析。html
經過上圖,咱們能夠知道,用戶登陸界面的後端流程,以下:前端
1. 接收前端傳遞的參數數據庫
2. 校驗參數後端
3. 核心邏輯瀏覽器
4. 返回響應結果cookie
其核心邏輯主要爲:session
判斷前端傳遞的手機號或用戶名是否存在MySQL數據庫中,post
1. 若是存在,則校驗密碼是否正確、spa
1.1 若是密碼正確,則設置狀態保持。code
1.2 若是密碼不正確,則響應用戶名或密碼錯誤
2. 若是不存在,則響應帳號不存在
既然咱們明確了核心的邏輯,那麼接下來咱們就用代碼說話吧。
class LoginView(View): def get(self, request): """提供用戶登陸頁面""" return render(request, 'login.html') def post(self, request): """實現用戶登陸邏輯""" # 接收參數 username = request.POST.get('username') password = request.POST.get('password') remembered = request.POST.get('remembered') # 校驗參數 # 判斷參數是否齊全,remembered是可選的 if not all([username, password]): return http.HttpResponseForbidden('缺乏必傳參數') # 判斷用戶名是不是5-20個字符 if not re.match(r'^[a-zA-Z0-9_-]{5,20}$', username): return http.HttpResponseForbidden('請輸入正確的用戶名或手機號') # 判斷密碼是不是8-20個數字 if not re.match(r'^[0-9A-Za-z]{8,20}$', password): return http.HttpResponseForbidden('密碼最少8位,最長20位') # 認證用戶 user = authenticate(request, username=username, password=password) if not user: return render(request, 'login.html', {'account_errmsg': '帳號或密碼錯誤'}) # 狀態保持 login(request, user) # 根據用戶是否記住登陸來設置狀態保持的生命週期 if remembered != 'on': # 不記住登陸:瀏覽器會話結束後狀態保持銷燬,設置session的有效期爲0秒 request.session.set_expiry(0) else: # 記住登陸:狀態保持爲兩週,若是傳入None,默認兩週 request.session.set_expiry(None) # 登陸成功後重定向到其餘頁面 next = request.GET.get('next') if next: # 跳轉到next對應的頁面 response = redirect(next) else: # # 跳轉到首頁 response = redirect(reverse('contents:index')) # 登陸成功以後,響應以前,用戶名寫入到cookie response.set_cookie('username', user.username, max_age=3600*24*7) # 響應結果 return response