(十三)登陆注册 逻辑一
之前我们学了如何用腾讯云发送短信
现在我们要简单说一下 有了手机号和验证码 怎么进行登录和注册(登陆跳转未完成)
逻辑
1. 校验手机号是否合法 2. 校验验证码 redis - 无验证码 - 有验证码 输入错误 - 有验证码 输入成功 3. 去数据库中获取用户信息(获取/创建) 4. 将一些信息返回给小程序
小程序端 我们现在假设已经输入了手机号和验证码

import uuid from rest_framework.exceptions import ValidationError from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import serializers from django_redis import get_redis_connection from app01 import models class LoginSerializer(serializers.Serializer): phone = serializers.CharField(label="手机号", validators=[phone_validator, ]) code = serializers.CharField(label="验证码") def validate_code(self, value): ''' 校验验证码 :param value: :return: ''' if len(value) != 4: raise ValidationError('短信格式错误') if not value.isdecimal(): raise ValidationError('短信格式错误') ''' initial_data 在这样必须用 initial_data相当于request.data 对比一下 is_valid中validated_data ''' phone = self.initial_data.get('phone') # code验证 conn = get_redis_connection() code = conn.get(phone) if not code: raise ValidationError('验证码过期') if value != code.decode('utf-8'): raise ValidationError('验证码过期') return value class LoginView(APIView): def post(self, request, *args, **kwargs): print(request.data) ''' 1. 校验手机号是否合法 2. 校验验证码 redis - 无验证码 - 有验证码 输入错误 - 有验证码 输入成功 3. 去数据库中获取用户信息(获取/创建) 4. 将一些信息返回给小程序 ''' ser = LoginSerializer(data=request.data) if not ser.is_valid(): return Response({"status": False, 'message': '验证码错误'}) phone = ser.validated_data.get('phone') ''' user = models.UserInfo.objects.filter(phone=phone).first() if not user: models.UserInfo.objects.create(phone=phone,token=str(uuid.uuid4())) else: user.token = uuid.uuid4() user.save() ''' user_object, flag = models.UserInfo.objects.get_or_create(phone=phone) user_object.token = str(uuid.uuid4()) user_object.save() return Response({"status": True, 'data':{'phone':phone,'token':user_object.token}})
分类:
微信小程序
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现