保存邮箱并发送验证邮件
Posted hzlnice
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了保存邮箱并发送验证邮件相关的知识,希望对你有一定的参考价值。
后端接口设计:
请求方式:PUT /email/
请求参数: JSON 或 表单
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
str | 是 | Email邮箱 |
返回数据: JSON
返回值 | 类型 | 是否必须 | 说明 |
---|---|---|---|
id | int | 是 | 用户id |
str | 是 | Email邮箱 |
在users/serializers.py中新建序列化器,用户验证用户提交的邮箱信息。
class EmailSerializer(serializers.ModelSerializer):
"""
邮箱序列化器
"""
class Meta:
model = User
fields = (‘id‘, ‘email‘)
extra_kwargs = {
‘email‘: {
‘required‘: True
}
}
def update(self, instance, validated_data):
instance.email = validated_data[‘email‘]
instance.save()
return instance
在users/views.py中创建新视图,用于保存用户的邮箱信息,注意需要用户登录通过认证后。
from rest_framework.permissions import IsAuthenticated
class EmailView(UpdateAPIView):
"""
保存用户邮箱
"""
permission_classes = [IsAuthenticated]
serializer_class = serializers.EmailSerializer
def get_object(self, *args, **kwargs):
return self.request.user
设置路由信息
url(r‘^emails/$‘, views.EmailView.as_view()), # 设置邮箱
补充发送验证邮件
在保存邮箱的时候,需要向用户发送验证邮件,我们将发送邮件的工作放到celery中异步执行。
在celerytasks目录中新建email目录和`email/_init.py文件和
email/tasks.py`文件
在email/tasks.py
文件中是实现发送邮件的异步任务
from celery_tasks.main import celery_app
from django.core.mail import send_mail
from django.conf import settings
@celery_app.task(name=‘send_verify_email‘)
def send_verify_email(to_email, verify_url):
"""
发送验证邮箱邮件
:param to_email: 收件人邮箱
:param verify_url: 验证链接
:return: None
"""
subject = "美多商城邮箱验证"
html_message = ‘<p>尊敬的用户您好!</p>‘ ‘<p>感谢您使用美多商城。</p>‘ ‘<p>您的邮箱为:%s 。请点击此链接激活您的邮箱:</p>‘ ‘<p><a href="%s">%s<a></p>‘ % (to_email, verify_url, verify_url)
send_mail(subject, "", settings.EMAIL_FROM, [to_email], html_message=html_message)
注意
在发送邮件的异步任务中,需要用到django的配置文件,所以我们需要修改celery的启动文件main.py,在其中指明celery可以读取的django配置文件,并且注册添加email的任务
from celery import Celery
# 为celery使用django配置文件进行设置
import os
if not os.getenv(‘DJANGO_SETTINGS_MODULE‘):
os.environ[‘DJANGO_SETTINGS_MODULE‘] = ‘meiduo_mall.settings.dev‘
# 创建celery应用
celery_app = Celery(‘meiduo‘)
# 导入celery配置
celery_app.config_from_object(‘celery_tasks.config‘)
# 自动注册celery任务
celery_app.autodiscover_tasks([‘celery_tasks.sms‘, ‘celery_tasks.email‘])
在User模型类中定义生成验证邮箱链接的方法
邮箱的激活链接是用户点击时会访问的网址,我们让用户点击时进入到success_verify_email.html页面。
def generate_verify_email_url(self):
"""
生成验证邮箱的url
"""
serializer = TJWSSerializer(settings.SECRET_KEY, expires_in=constants.VERIFY_EMAIL_TOKEN_EXPIRES)
data = {‘user_id‘: self.id, ‘email‘: self.email}
token = serializer.dumps(data).decode()
verify_url = ‘http://www.meiduo.site:8080/success_verify_email.html?token=‘ + token
return verify_url
修改EmailSerializer序列化器的update方法,增加发送邮件
def update(self, instance, validated_data):
email = validated_data[‘email‘]
instance.email = email
instance.save()
# 生成验证链接
verify_url = instance.generate_verify_email_url()
# 发送验证邮件
send_verify_email.delay(email, verify_url)
return instance
以上是关于保存邮箱并发送验证邮件的主要内容,如果未能解决你的问题,请参考以下文章