iT邦幫忙

2021 iThome 鐵人賽

DAY 22
0
Modern Web

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

[Day22] 發送驗證信API – views

  • 分享至 

  • xImage
  •  

嗨嗨~~ 夥伴們,大家好,今天我們要來說明的是,發送驗證信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
from IThome_Django import settings #新增
from django.core.mail import send_mail #新增
from django.core import signing #新增
import base64 #新增

@csrf_protect
def send(request):              #傳送驗證信
    if request.method == "POST":
        try:
            data = json.loads(bytes.decode(request.body,"utf-8"))
            token = email_token()
            email = data['email']
            token_s = token.generate_token(email)
            title = "帳號驗證"
            meg ="\n".join(["{0}歡迎使用app".format(email),
            "請點選下列連結完成註冊:\n",
            "/".join(['127.0.0.1:8000/user/check',token_s])])
            send_mail(title,meg,None,[email])
            message = {'status':'0',"token":token_s}
        except Exception as e:
            print(e)
            message = {'status':'1'}
        return JsonResponse(message)

class email_token():
    def __init__(self): 
        self.salt = str(base64.encodestring(bytes("1_23a48c9710295","utf-8")))
    def generate_token(self, email):
        signer = signing.TimestampSigner(salt=self.salt).sign_object(email)
        return signer
    def confirm_token(self,token):
        email = signing.TimestampSigner(salt=self.salt).unsign_object(token)
        return email

介紹function

今天的程式碼比前幾支的API都還要長一點點,還是要來跟夥伴們說明一下我的程式碼。

首先說明一下function,這邊因為要處理一些關於驗證碼的東西,所以整理成一塊email_token()大類別,裡面
__init__:主要是產生一個值作為salt用,當然你也可以用預設salt。

generate_tokenconfirm_token:這裡我一起說明,因為基本上這兩個功能相似,都是使用TimestampSigner,功能為加密簽名,可以避免裡面的資料被竄改。

我們透過signing.TimestampSigner(salt=self.salt).sign_object(email),存放的訊息是email,加密簽名,然後signing.TimestampSigner(salt=self.salt).unsign_object(token)這裡的token其實就是加密簽名完的資料,解密簽名,得到存放的訊息。

透過send_mail寄出信件,那第一個參數是信件標題,第二個參數是信件內容,第三個是寄件者,那因為我們昨天已經在settings設定過預設的寄件者了,所以這邊可以寫上None,第四個是收件者。

我們今天介紹完發送驗證信API,明天接著就是信箱驗證API,等明天一起介紹完,我在附上我的測試結果給夥伴們參考。


上一篇
[Day21] 發送驗證信API – 應用程式密碼、設定settings
下一篇
[Day23] 信箱驗證API – views
系列文
暑假旅程之自學Django30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言