保存郵箱並發送驗證郵件
阿新 • • 發佈:2018-07-31
args ssa request val ali getenv environ imp serial
後端接口設計:
請求方式: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
保存郵箱並發送驗證郵件