电商项目(卖家/买家)
一、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())