iT邦幫忙

2021 iThome 鐵人賽

DAY 25
0
Modern Web

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

[Day25] 找回密碼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
import string#新增
import random#新增
@csrf_protect
def forgot(request): #忘記密碼
    if request.method == "POST":
        data = json.loads(bytes.decode(request.body,"utf-8"))
        try:
            email = data['email']
            user = UserProfile.objects.get(email=email)
            chars=string.ascii_letters+string.digits         
            new_pw ="".join(random.sample(chars,16))
            user.set_password(new_pw)
            user.save()
            title = "找回密碼"
            sender = settings.EMAIL_HOST_USER
            meg ="\n".join(["歡迎".format(user.username),
            "新的密碼為:\n",new_pw])
            send_mail(title,meg,sender,[email])
            message = {"status":"0"}
        except:
            message = {"status":"1"}
        return JsonResponse(message)

想法及介紹function

我來說說我的想法以及function的用法,一樣先判斷Http Method為POST,然後抓取key為mail的value也就是我們輸入的email,再使用chars=string.ascii_letters+string.digits把英文字母跟數字串起來,再用random.sample(chars,16),產生一組資料型態為list,英文跟數字的亂數,而"".join()則可以把list每個元素用指定的符號連接起來,用這樣的方式產生一組新的由英文數字亂碼密碼,接著用user = UserProfile.objects.get(email=email)查詢資料庫與輸入email相符的使用者,user.set_password(new_pw)使用者設定密碼,最後用send_mail(title,meg,sender,[email])寄到信箱,簡單來說就是利用註冊的email,再重發一次密碼。

明天我們接著要來說明重設密碼API。


上一篇
[Day24] 發送驗證信API、信箱驗證API – urls、測試階段
下一篇
[Day26] 重設密碼API – views
系列文
暑假旅程之自學Django30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言