電商項目(賣家/買家)
一、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())