当前位置:   article > 正文

Django项目--邮箱验证(163为例)_django检查邮箱是否配置成功

django检查邮箱是否配置成功

一、163邮箱

1、

2、

3、

然后会有手机验证,验证一下,之后会有一个163邮箱授权密码,记得保存(只会出来这一次)

二、使用Django发送邮件

1、更新dev中的配置,设置邮箱的配置信息

  1. # 邮箱 163
  2. EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
  3. EMAIL_HOST = "smtp.163.com" # 写死
  4. EMAIL_PORT = 25 # 写死
  5. EMAIL_HOST_USER = "xxxxxxxxx@163.com" # 发送邮件的邮箱
  6. EMAIL_HOST_PASSWORD = "xxxxxxxxxxxx" # 授权码
  7. EMAIL_FROM = '测试<xxxxxxxxxxxx@163.com>' # 收件人看到的发件人

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

例如:

  1. msg='<a href="http://xxx" target="_blank">点击激活</a>'
  2. send_mail('注册激活','',settings.EMAIL_FROM, ['xxxxxx@163.com'], html_message=msg)

三、保存邮件并且发送验证邮件

1、在serializers中创建序列化器

  1. class EmailSerializer(serializers.ModelSerializer):
  2. """
  3. 邮箱序列化器
  4. """
  5. class Meta:
  6. model = User
  7. fields = ('id', 'email')
  8. extra_kwargs = {
  9. 'email': {
  10. 'required': True
  11. }
  12. }
  13. def update(self, instance, validated_data):
  14. instance.email = validated_data['email']
  15. instance.save()
  16. return instance

2、在views中创建新的视图

  1. from rest_framework.permissions import IsAuthenticated
  2. class EmailView(UpdateAPIView):
  3. """
  4. 保存用户邮箱
  5. """
  6. permission_classes = [IsAuthenticated]
  7. serializer_class = serializers.EmailSerializer
  8. def get_object(self, *args, **kwargs):
  9. return self.request.user

3、urls中设置路由

  1. # 更新邮箱
  2. path('email/', views.EmailView.as_view()),

4、补充发送验证邮件

  1. def send_verify_email(self, to_email, verify_url):
  2. """
  3. 发激活邮件
  4. @param to_email: 收件人邮箱
  5. @param verify_url: 邮箱激活url
  6. @return:
  7. """
  8. subject = "XXXX邮箱验证"
  9. html_message = '<p>尊敬的用户您好!</p>' \
  10. '<p>感谢您使用XXXX。</p>' \
  11. '<p>您的邮箱为:%s 。请点击此链接激活您的邮箱:</p>' \
  12. '<p><a href="%s">%s<a></p>' % (to_email, verify_url, verify_url)
  13. # send_mail(subject:标题, message:普通邮件正文, 发件人, [收件人], html_message: 超文本的邮件内容)
  14. send_mail(subject, "", settings.EMAIL_FROM, [to_email], html_message=html_message)

5、在User模型中定义验证邮箱链接的方法

  1. def generate_email_verify_url(self):
  2. """生成邮箱激活链接"""
  3. # 1.创建加密序列化器
  4. serializer = TJWSSerializer(settings.SECRET_KEY, 3600 * 24) # 有效期24小时
  5. # 2.调用dumps方法进行加密
  6. data = {'user_id': self.id, 'email': self.email}
  7. token = serializer.dumps(data).decode()
  8. # 拼接激活url
  9. return 'http://127.0.0.1:8080/success_verify_email.html?token=' + token

6、修改EmailSerializer 序列化器中的update方法

  1. def update(self, instance, validated_data):
  2. instance.email = validated_data.get('email')
  3. instance.save()
  4. # 'http://127.0.0.1:8080/success_verify_email.html?token=' + token
  5. verify_url = instance.generate_email_verify_url()
  6. # 发邮件
  7. self.send_verify_email(to_email=instance.email, verify_url=verify_url)
  8. return instance

四、验证邮箱链接

1、在views中添加新的视图

  1. # 邮箱激活
  2. # path('emails/verification/', views.EmailVerifyView.as_view()),
  3. class EmailVerifyView(APIView):
  4. """激活用户邮箱"""
  5. def get(self, request):
  6. # 获取前端查询字符串中传入的token
  7. token = request.query_params.get('token')
  8. if not token:
  9. return Response({'message': '缺少token'}, status=status.HTTP_400_BAD_REQUEST)
  10. # 把token解密 并查询对应的user
  11. user = User.check_verify_email_token(token)
  12. # 修改当前user的email_active为True
  13. if user is None:
  14. return Response({'message': '激活失败'}, status=status.HTTP_400_BAD_REQUEST)
  15. user.email_active = True
  16. user.save()
  17. # 响应
  18. return Response({'message': 'ok'})

2、User模型中定义token方法

  1. @staticmethod # 修饰成为静态方法 使用User.check_verify_email_token(token) 进行调用
  2. def check_verify_email_token(token):
  3. """对token解密,并查询对应的user"""
  4. # 1.创建加密序列化器
  5. serializer = TJWSSerializer(settings.SECRET_KEY, 3600 * 24) # 有效期24小时
  6. # 2.调用loads解密
  7. try:
  8. data = serializer.loads(token)
  9. except BadData:
  10. return None
  11. else:
  12. id = data.get('user_id')
  13. email = data.get('email')
  14. try:
  15. user = User.objects.get(id=id, email=email)
  16. except User.DoesNotExist:
  17. return None
  18. else:
  19. return user
'
运行

五、知识点

1、在类里面写静态方法

静态方法可以直接用

  1. class User():
  2. @staticmethod # 修改为静态类方法,使用User.check_verify_email_token(token) 调用
  3. def check_verify_email_token(token):
  4. pass

2、save()操作

save操作对应两个操作,如果携带instance(一个实例对象)参数就调用updata,没有就调用create方法

3、获取用户对象的方法

在views视图的方法中可以通过request.user获取当前用户对象,还可以通过User.objects.get(id=user_id),User是对象模型

在serializers中可以通过    user = self.context['request'].user

4、异常错误

在is_valid 和save之间使用.data会报错
  1. serializer.is_valid(raise_exception=True)
  2. # print(serializer.data) #会报错 在is_valid 和save之间使用.data会报错
  3. serializer.save()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/932876
推荐阅读
  

闽ICP备14008679号