嗨嗨~~ 夥伴們,大家好,今天我們要來說明的是,發送驗證信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
今天的程式碼比前幾支的API都還要長一點點,還是要來跟夥伴們說明一下我的程式碼。
首先說明一下function,這邊因為要處理一些關於驗證碼的東西,所以整理成一塊email_token()
大類別,裡面__init__
:主要是產生一個值作為salt用,當然你也可以用預設salt。
generate_token
、confirm_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,等明天一起介紹完,我在附上我的測試結果給夥伴們參考。