如何编写ApiView校验用户验证码并更新User模型的is_verified状态
邮箱验证码校验ApiView实现方案
基于你提供的User模型,我们可以用Django REST Framework的APIView实现验证码校验接口,核心逻辑是接收用户的邮箱(或用户名)与输入的验证码,比对数据库中存储的verification_code,一致则将用户的is_verified设为True。
1. 编写请求参数序列化器
先定义一个序列化器,用来验证前端传来的参数格式是否合法:
from rest_framework import serializers class VerifyCodeSerializer(serializers.Serializer): email = serializers.EmailField(required=True) verification_code = serializers.CharField(required=True, max_length=30)
2. 实现核心校验视图
编写继承自APIView的视图类,在post方法中处理验证码校验逻辑:
from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status from .models import User class VerifyEmailAPIView(APIView): def post(self, request): serializer = VerifyCodeSerializer(data=request.data) # 验证请求参数合法性 if not serializer.is_valid(): return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) email = serializer.validated_data['email'] input_code = serializer.validated_data['verification_code'] try: # 通过邮箱定位用户 user = User.objects.get(email=email) except User.DoesNotExist: return Response({"error": "该邮箱未注册"}, status=status.HTTP_404_NOT_FOUND) # 比对验证码 if user.verification_code == input_code: # 标记用户为已验证 user.is_verified = True # 可选:验证成功后清空验证码,避免重复利用 user.verification_code = "" user.save() return Response({"message": "验证成功"}, status=status.HTTP_200_OK) else: return Response({"error": "验证码错误"}, status=status.HTTP_400_BAD_REQUEST)
3. 配置路由
在项目的urls.py中添加对应路由,让接口可以被访问:
from django.urls import path from .views import VerifyEmailAPIView urlpatterns = [ # 其他路由... path('verify-email/', VerifyEmailAPIView.as_view(), name='verify-email'), ]
额外建议
- 如果需要基于用户名校验,只需把序列化器的
email字段改成username,视图中查找用户的条件改为User.objects.get(username=username)。 - 建议给验证码添加过期机制:在User模型中新增
verification_code_expire字段(DateTimeField类型),校验时同时判断当前时间是否超过过期时间,提升安全性。 - 验证成功后清空验证码是最佳实践,防止同一验证码被多次使用。
内容的提问来源于stack exchange,提问作者Kirill_N
相关产品推荐
相关产品推荐

