1. 程式人生 > >保存郵箱並發送驗證郵件

保存郵箱並發送驗證郵件

args ssa request val ali getenv environ imp serial

後端接口設計:

請求方式:PUT /email/

請求參數: JSON 或 表單

參數類型是否必須說明
email str Email郵箱

返回數據: JSON

返回值類型是否必須說明
id int 用戶id
email 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

保存郵箱並發送驗證郵件