Django框架(十五)--異步通信

電商項目(賣家/買家)

一、Web開發與Django項目異步通信

郵件和短信發送:通知、驗證的作用

驗證:比如用戶密碼相關,資金相關,都是對身份的驗證

使用郵箱或者短信或者釘釘做一個登錄驗證(獲取驗證碼,添加驗證碼,登錄)

獲取驗證碼:頁面增加按鈕,ajax請求,視圖可以使用get請求

提交驗證碼:隨着form表單提交,登錄接口視圖,接收驗證碼進行驗證

(一)python郵件發送

python發送郵件很方便,因爲python中有內置模塊:

  • smtplib
    • smtp協議,python發送郵件默認基於輕量級的郵件協議,是通過發送地址和目的地址進行郵件發送的郵件協議。
  • email
    • 整合郵件內容,及郵件內容的格式

發送郵件:

  • 郵件:
    • 發信人
    • 收件人
    • 內容
      • 文本
      • 附件
      • html(自動化測試報告)
    • 主題
  • 郵件服務器
    • 登錄服務器
    • 登錄賬號
    • 發送郵件
    • 退出服務器

使用163郵箱發送郵件

開啓163服務
在這裏插入圖片描述
在這裏插入圖片描述在這裏插入圖片描述
163郵箱服務端口
在這裏插入圖片描述

demo

import smtplib
from email.mime.text import MIMEText

# 構建郵件
# 主題
subject = 'demo'
# 內容
content = '比心心'
# 發件人
sender = 'xxxxxxxx'
# 收件人
receiver ='xxxxxxx,xxxxxxxx'
# 服務密碼
password = 'xxxxxxxx'
# MIMEtext
# 參數:發送內容 內容類型 編碼
message = MIMEText(content,'plain','utf-8')
message["Subject"] = subject
message["From"] = sender
message["To"] = receiver

# 發送
smtp = smtplib.SMTP_SSL('smtp.163.com',465)
# 發件人登錄
smtp.login(sender,password)
# 參數:發件人 收件人(需要列表) 發送郵箱,類似一種json
smtp.sendmail(sender,receiver.split(","),message.as_string())
smtp.close()

(二)python短信發送

在這裏插入圖片描述

常用的:阿里短信,雲通訊

示例: http://www.ihuyi.com/

註冊
在這裏插入圖片描述

登錄
在這裏插入圖片描述

模板
在這裏插入圖片描述

下載文檔
在這裏插入圖片描述
在這裏插入圖片描述

demo

在這裏插入圖片描述
在這裏插入圖片描述

import requests

url = "http://106.ihuyi.com/webservice/sms.php?method=Submit"

# APIID
account = "xxxxxxxxx"
# APIkey
password = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

mobile = "xxxxxxxxxxx'"
content = "您的驗證碼是:1111。請不要把驗證碼泄露給其他人。"
# 請求頭
headers = {
    "Content-type": "application/x-www-form-urlencoded",
    "Accept": "text/plain"
}
# 構建發送參數
data = {
    "account": account,
    "password": password,
    "mobile": mobile,
    "content": content,
}
# 發送
response = requests.post(url,headers = headers,data=data)
    # url--請求地址
    # headers--請求頭
    # data--請求數據,內容

print(response.content.decode())

(三)Django郵件驗證碼

創建模型

class Vaild_Code(models.Model):
    code_content = models.CharField(max_length=8,verbose_name='驗證碼')
    code_time = models.FloatField(verbose_name='創建時間')
    # 1使用 0未使用
    code_status = models.IntegerField(verbose_name='狀態')
    code_user = models.EmailField(verbose_name='郵箱')

模板

在這裏插入圖片描述
在這裏插入圖片描述

路由

在這裏插入圖片描述

視圖

# 發送郵件
def send_email(params):
    # 傳一個字典類型的參數params
    subject = '登錄驗證碼'
    content = params.get('content')
    sender = 'xxxxxxxxxxxx'
    receiver = params.get('receiver')
    password = 'xxxxxxx'
    message = MIMEText(content, 'plain', 'utf-8')
    message["Subject"] = subject
    message["From"] = sender
    message["To"] = receiver
    try:
        smtp = smtplib.SMTP_SSL('smtp.163.com', 465)
        smtp.login(sender, password)
        smtp.sendmail(sender, receiver.split(","), message.as_string())
        smtp.close()
        return True
    except:
        return False

# 保存驗證碼
def get_code(request):
    result = {'code':10000,'msg':''}
    email = request.GET.get('email')
    if email:
        flag = LoginUser.objects.filter(email=email,user_type=0).exists()
        if flag:
            # 四位
            code = random.randint(1000,9999)
            content = '您的驗證碼是%s,不要告訴別人'%(code)
            params={'content':content,'receiver':email}
            eflag = send_email(params)
            if eflag:
                # 保存驗證碼到數據庫
                vaild_code = Vaild_Code()
                vaild_code.code_content = code
                vaild_code.code_status = 0
                vaild_code.code_user = email
                vaild_code.code_time = time.time()
                vaild_code.save()
                result['msg'] = '驗證碼發送成功'
            else:
                result['code'] = 10003
                result['msg'] = '未知錯誤,請聯繫客服'
        else:
            result['code'] = 10002
            result['msg'] = '用戶不存在'
    else:
        result['code']=10001
        result['msg'] = '郵箱不可爲空'

    return JsonResponse(result)

修改login登錄驗證視圖

def login(request):
    if request.method=='POST':
        email = request.POST.get('email')
        password = request.POST.get('password')
        code = request.POST.get('vaild_code')
        if email:
            user = LoginUser.objects.filter(email=email,user_type=0).first()
            if user:
                if user.password==setPassword(password):
                    vaild_code = Vaild_Code.objects.filter(code_status=0,code_user=email,code_content=code).first()
                    if vaild_code:
                        if time.time() - vaild_code.code_time < 120:
                            response = HttpResponseRedirect('/Saller/index/')
                            response.set_cookie('email', email)
                            response.set_cookie('password', password)
                            response.set_cookie('user_type', user.user_type)
                            response.set_cookie('userid', user.id)
                            request.session['email'] = email
                            vaild_code.code_status = 1
                            vaild_code.save()
                            return response
                        else:
                            error_msg = '驗證碼超時,請重新獲取'
                    else:
                        error_msg = '驗證碼不正確'
                else:
                    error_msg = '密碼錯誤'
            else:
                error_msg = '該用戶不存在,請先註冊'
        else:
            error_msg = '郵箱不可爲空'
    return render(request,'saller/login.html',locals())
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章