赞
踩
然后会有手机验证,验证一下,之后会有一个163邮箱授权密码,记得保存(只会出来这一次)
- # 邮箱 163
- EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
- EMAIL_HOST = "smtp.163.com" # 写死
- EMAIL_PORT = 25 # 写死
- EMAIL_HOST_USER = "xxxxxxxxx@163.com" # 发送邮件的邮箱
- EMAIL_HOST_PASSWORD = "xxxxxxxxxxxx" # 授权码
- EMAIL_FROM = '测试<xxxxxxxxxxxx@163.com>' # 收件人看到的发件人
例如:
- msg='<a href="http://xxx" target="_blank">点击激活</a>'
- send_mail('注册激活','',settings.EMAIL_FROM, ['xxxxxx@163.com'], html_message=msg)
- 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

- 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
- # 更新邮箱
- path('email/', views.EmailView.as_view()),
- def send_verify_email(self, to_email, verify_url):
- """
- 发激活邮件
- @param to_email: 收件人邮箱
- @param verify_url: 邮箱激活url
- @return:
- """
- subject = "XXXX邮箱验证"
- html_message = '<p>尊敬的用户您好!</p>' \
- '<p>感谢您使用XXXX。</p>' \
- '<p>您的邮箱为:%s 。请点击此链接激活您的邮箱:</p>' \
- '<p><a href="%s">%s<a></p>' % (to_email, verify_url, verify_url)
- # send_mail(subject:标题, message:普通邮件正文, 发件人, [收件人], html_message: 超文本的邮件内容)
- send_mail(subject, "", settings.EMAIL_FROM, [to_email], html_message=html_message)
- def generate_email_verify_url(self):
- """生成邮箱激活链接"""
-
- # 1.创建加密序列化器
- serializer = TJWSSerializer(settings.SECRET_KEY, 3600 * 24) # 有效期24小时
- # 2.调用dumps方法进行加密
- data = {'user_id': self.id, 'email': self.email}
- token = serializer.dumps(data).decode()
- # 拼接激活url
- return 'http://127.0.0.1:8080/success_verify_email.html?token=' + token
- def update(self, instance, validated_data):
- instance.email = validated_data.get('email')
- instance.save()
- # 'http://127.0.0.1:8080/success_verify_email.html?token=' + token
- verify_url = instance.generate_email_verify_url()
- # 发邮件
- self.send_verify_email(to_email=instance.email, verify_url=verify_url)
-
- return instance
- # 邮箱激活
- # path('emails/verification/', views.EmailVerifyView.as_view()),
-
- class EmailVerifyView(APIView):
- """激活用户邮箱"""
-
- def get(self, request):
- # 获取前端查询字符串中传入的token
- token = request.query_params.get('token')
- if not token:
- return Response({'message': '缺少token'}, status=status.HTTP_400_BAD_REQUEST)
- # 把token解密 并查询对应的user
- user = User.check_verify_email_token(token)
- # 修改当前user的email_active为True
- if user is None:
- return Response({'message': '激活失败'}, status=status.HTTP_400_BAD_REQUEST)
- user.email_active = True
- user.save()
- # 响应
- return Response({'message': 'ok'})

- @staticmethod # 修饰成为静态方法 使用User.check_verify_email_token(token) 进行调用
- def check_verify_email_token(token):
- """对token解密,并查询对应的user"""
- # 1.创建加密序列化器
- serializer = TJWSSerializer(settings.SECRET_KEY, 3600 * 24) # 有效期24小时
- # 2.调用loads解密
- try:
- data = serializer.loads(token)
- except BadData:
- return None
- else:
- id = data.get('user_id')
- email = data.get('email')
- try:
- user = User.objects.get(id=id, email=email)
- except User.DoesNotExist:
- return None
- else:
- return user
'运行
静态方法可以直接用
- class User():
- @staticmethod # 修改为静态类方法,使用User.check_verify_email_token(token) 调用
- def check_verify_email_token(token):
- pass
save操作对应两个操作,如果携带instance(一个实例对象)参数就调用updata,没有就调用create方法
在views视图的方法中可以通过request.user获取当前用户对象,还可以通过User.objects.get(id=user_id),User是对象模型
在serializers中可以通过 user = self.context['request'].user
在is_valid 和save之间使用.data会报错
- serializer.is_valid(raise_exception=True)
- # print(serializer.data) #会报错 在is_valid 和save之间使用.data会报错
- serializer.save()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。