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())
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值