昨天做了註冊的API,想當然,有註冊就有登入登出,不然要註冊要幹嘛XD
所以今天要來做的是登入、登出API的部分,這邊首先還是一樣,來到我們的views,要來撰寫我們登入、登出的主要邏輯,先來看到我們登入的部分~~~
from datetime import datetime
import json
import uuid
from django.contrib.auth.models import User
from django.http.response import JsonResponse
from django.views.decorators.csrf import csrf_protect
from user.models import UserProfile
from django.contrib import auth #新增
from django.contrib.sessions.models import Session#新增
@csrf_protect
def login(request): #登入
if request.method == "POST":
data = json.loads(bytes.decode(request.body,"utf-8"))
try:
account = data['account']
password = data['password']
auth_obj = auth.authenticate(username=account,password=password)#驗證帳號對錯
if auth_obj is not None: #驗證成功
if request.user.is_authenticated == False:#驗證是否有帳號已登入/新增開始
auth_obj.check_password(password) #檢查輸入與驗證返回user對象密碼是否相符
request.session.create()
auth.login(request,auth_obj)
message = {"status": "登入成功"}
else:
message = {"status":"帳號已登入"}
else:
message = {"status":"帳號密碼輸入錯誤"}
except :
message = {"status": "登入失敗"}
return JsonResponse(message)
簡單說明一下我的想法以及function的功能,我主要是先判斷帳號驗證是否有成功,而且是要使用者在未驗證的狀態下,才會登入,登入之後使用者狀態才會變成已驗證,但是如果帳號正確,可是使用者已驗證會顯示已登入。
auth.authenticate(username=account,password=password)
:主要功能是驗證帳號、密碼是否正確,如果正確,則會返回相對應對象的資料,如果不正確,則會返回None。request.user.is_authenticated
:判斷帳戶是否通過驗證。auth_obj.check_password
:檢查輸入與驗證返回user對象密碼是否相符。request.session.create
:創建session,如果忘記甚麼是session的夥伴,可以回到Day13、14複習一下唷~~~auth.login
:將一個已驗證的帳戶附在session上。@csrf_protect
def logout(request): #登出
try:
auth.logout(request)
message = {"status":"登出成功"}
except:
message = {"status":"登出失敗"}
return JsonResponse(message)
登出,就不多解釋啦XD,只有一行程式就是登出~~
這裡有官方文件,關於login、logout、authenticated的用法說明
今天把邏輯都寫完了~~ 明天就可以開始設定登入、登出的urls啦~~~