iT邦幫忙

2021 iThome 鐵人賽

DAY 19
1
Modern Web

暑假旅程之自學Django系列 第 19

[Day19] 登入、登出API – views

  • 分享至 

  • xImage
  •  

昨天做了註冊的API,想當然,有註冊就有登入登出,不然要註冊要幹嘛XD
所以今天要來做的是登入、登出API的部分,這邊首先還是一樣,來到我們的views,要來撰寫我們登入、登出的主要邏輯,先來看到我們登入的部分~~~

登入API程式碼

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

簡單說明一下我的想法以及function的功能,我主要是先判斷帳號驗證是否有成功,而且是要使用者在未驗證的狀態下,才會登入,登入之後使用者狀態才會變成已驗證,但是如果帳號正確,可是使用者已驗證會顯示已登入。

  • auth.authenticate(username=account,password=password):主要功能是驗證帳號、密碼是否正確,如果正確,則會返回相對應對象的資料,如果不正確,則會返回None。
  • request.user.is_authenticated:判斷帳戶是否通過驗證。
  • auth_obj.check_password:檢查輸入與驗證返回user對象密碼是否相符。
    提醒:「auth_obj.」要注意,因為我auth_obj=auth.authenticate 這行程式,返回使用者資料是儲存到auth_obj變數裡,所以如果夥伴有改寫auth_obj這個變數名稱的話,這裡的check_password前面也要改寫唷~~
  • request.session.create:創建session,如果忘記甚麼是session的夥伴,可以回到Day13、14複習一下唷~~~
  • auth.login:將一個已驗證的帳戶附在session上。

登出API程式碼

@csrf_protect
def logout(request):        #登出
    try:
        auth.logout(request)
        message = {"status":"登出成功"}
    except:
        message = {"status":"登出失敗"}
    return JsonResponse(message)

登出,就不多解釋啦XD,只有一行程式就是登出~~

這裡有官方文件,關於login、logout、authenticated的用法說明

今天把邏輯都寫完了~~ 明天就可以開始設定登入、登出的urls啦~~~


上一篇
[Day18] 註冊API – 測試階段之csrf_protect
下一篇
[Day20] 登入、登出API – urls、測試階段
系列文
暑假旅程之自學Django30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言