保存邮箱界面如下

接口设计如下

视图逻辑:

因为url是不接受pk参数的,所以UpdateApiView无法确定要更新哪个模型类,所以要重写get_object,告诉他更新哪个模型类。这里更新的是user模型类。

序列化器如下

序列化器中就两个字段id和email,关于这俩字段的方向问题,都不用处理。

id,默认只能做序列化操作。

email,序列化器和反序列化都要做,也是默认。

注意:这里还没有处理到更新邮箱的逻辑,在下边发送邮件的时候,处理。

发送邮件

使用Django发送邮件的方法

在Django配置文件中,设置邮箱的配置信息

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.163.com'
EMAIL_PORT = 25
#发送邮件的邮箱
EMAIL_HOST_USER = 'xxxxxx@163.com'
#在邮箱中设置的客户端授权密码
EMAIL_HOST_PASSWORD = 'xxxxxx'
#收件人看到的发件人
EMAIL_FROM = 'python<xxxxxx@163.com>'

使用Django提供的模块发送邮件

django.core.mail模块提供了send_mail来发送邮件。

send_mail(subjectmessagefrom_emailrecipient_list,html_message=None)

  • subject 邮件标题
  • message 普通邮件正文, 普通字符串
  • from_email 发件人
  • recipient_list 收件人列表
  • html_message 多媒体邮件正文,可以是html字符串

例如:

msg='<a href="http://www.xxxxx.com/xxx/xxxxxxxxxxxxxxxxxxxxxx" target="_blank">点击激活</a>'
send_mail('你好,这是一封注册激活邮件','',settings.EMAIL_FROM, ['xxxxxxx@163.com'], html_message=msg)

定义发送邮件的任务

配置Email:

使用celery_tasks新建任务email:

配置任务:

需要生成一个类似于这样的链接

http://www.xxxx.site:8080/success_verify_email.html?token=eyJpYXQiOjE1NDE0MTI5MDUsImV4cCI6MTU0MTQ5OTMwNSwiYWxnIjoiSFMyNTYifQ.eyJ1c2VyX2lkIjoyLCJlbWFpbCI6Ijc1NDIyMDczMkBxcS5jb20ifQ.qo-yjH3gHJqXc8nMdZYBBEbJhX8e9rlVZrVQqXTAAzQ

这里带了一个参数token=....  激活用户,其实把用户的ID带上去即可,但是不能直接带上用户id,因为用户可以直接修改,所以需要加密

其实绑定邮箱,就是更新用户的信息,所以需要再邮件序列化器上增加一个update方法

调用了用户模型类对象instance的generate_verify_email_url:(这里的instance指的就是用户对象,user对象)

那么就在user模型类中增加generate_verify_email_url方法

用到的常量

增加一个url

修改user_center_info.js文件,增加save_email方法

        // 保存email
save_email: function(){
var re = /^[a-z0-9][\w\.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$/;
if(re.test(this.email)) {
this.email_error = false;
} else {
this.email_error = true;
return;
}
axios.put(this.host + '/email/',
{ email: this.email },
{
headers: {
'Authorization': 'JWT ' + this.token
},
responseType: 'json'
})
.then(response => {
this.set_email = false;
this.send_email_btn_disabled = true;
this.send_email_tip = '已发送验证邮件'
})
.catch(error => {
alert(error.data);
});
}

启动celery,然后测试

celery -A celery_tasks.main worker -l info

celery收到任务,然后执行。

测试完成

Django商城项目笔记No.14用户部分-用户中心邮箱绑定的更多相关文章

  1. Django商城项目笔记No.6用户部分-注册接口-短信验证码实现celery异步

    Django商城项目笔记No.4用户部分-注册接口-短信验证码实现celery异步 接上一篇,如何解决前后端请求跨域问题? 首先想一下,为什么图片验证码请求的也是后端的api.meiduo.site: ...

  2. Django商城项目笔记No.12用户部分-QQ登录2获取QQ用户openid

    Django商城项目笔记No.12用户部分-QQ登录2获取QQ用户openid 上一步获取QQ登录网址之后,测试登录之后本该跳转到这个界面 但是报错了: 新建oauth_callback.html & ...

  3. Django商城项目笔记No.11用户部分-QQ登录1获取QQ登录网址

    Django商城项目笔记No.11用户部分-QQ登录 QQ登录,亦即我们所说的第三方登录,是指用户可以不在本项目中输入密码,而直接通过第三方的验证,成功登录本项目. 若想实现QQ登录,需要成为QQ互联 ...

  4. Django商城项目笔记No.10用户部分-登录接口

    Django商城项目笔记No.10用户部分-登录接口 添加url路由 接下来第二步,增加返回内容: 增加结果如下: 配置:上边的方法定义了返回的内容都有哪些,那这个方法jwt还不知道,需要配置: 修改 ...

  5. Django商城项目笔记No.9用户部分-注册接口签发JWTtoken

    Django商城项目笔记No.9用户部分-注册接口签发JWTtoken 我们在验证完用户的身份后(检验用户名和密码),需要向用户签发JWT,在需要用到用户身份信息的时候,还需核验用户的JWT. 关于签 ...

  6. Django商城项目笔记No.8用户部分-注册接口实现

    Django商城项目笔记No.8用户部分-注册接口实现 users的view.py中增加如下代码 class RegisterUserView(CreateAPIView): "" ...

  7. Django商城项目笔记No.7用户部分-注册接口-判断用户名和手机号是否存在

    Django商城项目笔记No.7用户部分-注册接口-判断用户名和手机号是否存在 判断用户名是否存在 后端视图代码实现,在users/view.py里编写如下代码 class UsernameCount ...

  8. Django商城项目笔记No.5用户部分-注册接口-短信验证码

    Django商城项目笔记No.4用户部分-注册接口-短信验证码 短信验证码也保存在redis里(sms_code_15101234567) 在views中新增SMSCodeView类视图,并且写出步骤 ...

  9. Django商城项目笔记No.4用户部分-注册接口-图片验证码

    Django商城项目笔记No.4用户部分-注册接口-图片验证码 1.首先分析注册业务接口 1.1.分析可得,至少这么几个接口 图片验证码 短信验证码 用户名是否存在 手机号是否存在 整体注册接口 图片 ...

随机推荐

  1. dom操作------操作元素属性的若干方法

    // 1,通过HTMLElement类型的属性来获得和设置元素特性(设置的是元素属性,比如class,id,title,而不是css样式,比如float,border等)let div = docum ...

  2. Redis集合操作

    Redis的集合以无序的形式存储多个各不相同的元素 (常用的集合命令) SADD : SADD key-name item [item ...]----------将一个或多个元素添加到集合里,并返回 ...

  3. unity中 TextMeshPro 的常用标签

    这个第二和第三个写反了. 例子10中的123标签需要用到另一个字体,详情看 TextMeshPro 的官方示例10.

  4. C# ArrayList的使用方法小总结

    1.什么是ArrayList ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处: 动态的增加和减少元素 实现了ICollection和ILis ...

  5. [日常] Linux下vim的常用命令总结

    vim按d表示剪切按dd剪切一行vim命令:命令模式 /关键字 n继续向下查找 vim的多行注释:1.按ctrl + v进入 visual block模式2.按上下选中要注释的行3.按大写字母I,再插 ...

  6. Tomcat Connector原理

    Tomcat工作原理 要了解其中的工作原理我们首先看如下两个图 Tomcat基本架构图: Tomcat请求示意图: 客户端的请求通过Connector接受处理后在到容器Engine->Host- ...

  7. gradle tool升级到3.0注意事项

    Gradle版本升级 其实当AS升级到3.0之后,Gradle Plugin和Gradle不升级也是可以继续使用的,但很多新的特性如:Java8支持.新的依赖匹配机制.AAPT2等新功能都无法正常使用 ...

  8. JSP学习笔记(6)-使用数据库

    1.连接MySQL数据库 1.1.JDBC JDBC(Java Database Connectivity)提供了访问数据库的API,由一些Java类和接口组成,是Java运行平台核心库中的一部分.用 ...

  9. 使用ThinkPHP实现附件上传

    刚学的使用ThinkPHP框架简单上传附件(图片,文档,视频等文件) 首先需要了解tp框架中Upload.class.php(ThinkPHP/Library/Think/Upload,class,p ...

  10. java.lang.IllegalArgumentException: findUserById is ambiguous in Mapped Statements collection

    这是由于mybatis的mapper  xml文件中的id 名字和mybatis内置的方法可能有冲突导致的,  更改xml 的id  名字就可以了!