保存邮箱界面如下

接口设计如下

视图逻辑:

因为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收到任务,然后执行。

测试完成

最新文章

  1. JSON转化为JAVABEAN集合
  2. Nginx配置单主机多域名
  3. 锋利的js之验证身份证号
  4. 机器学习实战--logistic回归
  5. iis7+ 禁止IP访问设置方法
  6. MySQL处理数据库和表的常用命令
  7. 凸包(Convex Hull)构造算法——Graham扫描法
  8. hdu2085
  9. ADO.NET笔记——使用Connection连接数据库,使用Command对象的ExecuteReader()方法创建DataReader对象返回多行数据
  10. 图表框架HelloCharts(1)线形图
  11. openStack images
  12. Period
  13. .NET MVC4 实训记录之七(实现资源的自主访问后续)
  14. cxgrid学习
  15. 大话RabbitMQ 基础入门
  16. QueryHelper
  17. Android开发(十八)——头部、中部、底部布局技巧
  18. JWT 基础教程
  19. 启动docker 端口映射时IPV4无法使用
  20. LINUX 下挂载 exfat 格式 u 盘或移动硬盘

热门文章

  1. UVa 442 Matrix Chain Multiplication(栈的应用)
  2. MVC应用程序显示RealPlayer(rm)视频
  3. Spring基础(1) : 自动装配
  4. js 中格式化时间
  5. 乐字节-Java8新特性-Lambda表达式
  6. 多线程系列(1)多线程基础和Thread
  7. vue 相对路径的图片 不显示问题
  8. JS 闭包 p5
  9. 5月7日——采用第三方页面内容,但是顶部title使用自己的
  10. BZOJ2337: [HNOI2011]XOR和路径(期望 高斯消元)