web项目 day02(六)

登陆接口实现及用户模型字典格式输出

在写代码之前,一定要把流程搞清楚再写代码
通过验证码登录或注册接口
如果手机号已存在,则登录,否则,注册
1、检测验证码是否正确
2、注册或登录

还要注意一些细节上的东西:

  1. 举个例子,有些app在点击获取验证码的时候会将号码一栏置灰,这样获取验证码的时候就不能更改手机号,但是这样是很不方便的,如果用户输错了手机号,想要修改,只能等待一定时间重新获取验证码的时候才能继续修改,用户的体验会很差,容易造成用户流失,这是很严重的问题(这些设置都是前端的操作)
    所以,一般情况下,用户获取验证码都是可以修改手机号,而且还能重新获取验证码,但是问题就来了,用户登陆的时候,如果获取了验证码,但不小心修改了手机号,这时候前端提交上来的验证码是正确的,但手机号是错误的,后端就需要返回数据,告诉前端,输入的手机号有误

  2. 验证码是由过期时间的,还要考虑有效时间怎么去实现:
    使用缓存,比如redis缓存
    Django内部有缓存机制,开发时可以使用,生产环境时切换回redis
    查看该篇文章简单了解Django内部缓存机制的一些简单内容 https://blog.csdn.net/qq_44614026/article/details/96601746

  3. 怎么去传输和用户id搭关的数据,网页端Django是有cookie和session机制,是因为浏览器有对应存储的数据库,
    但是app端,安卓和ios是没有cookie和session这个说法的,确定用户,根据用户的信息传输相应的数据时是用token

着重注意:后端考虑接口数据的传输的时候要考虑细致,要全面的考虑到一切可能发生的情况

1. 初始化登陆接口

在apis .py文件中写登陆接口,先写一些伪代码,如果用户存在,则获取id,如果用户不存在,则创建用户(注册)

在这里插入图片描述
然后将这个接口的路由配置一下
在这里插入图片描述
第一步是检测验证码是否正确,首先要去获取发送成功的验证码

2. 保存发送成功的验证码

按照流程,检测验证码是否正确,需要将验证码保存起来,保存验证码这个步骤应当在发送验证码成功保存,验证码没发送成功去保存验证码没有意义
所以,在logics .py文件中,将发送验证码赋给变量ret,如果发送成功,就将验证码保存到缓存中,有个key,value值为验证码code,过期时间为3分钟
在这里插入图片描述
那么问题来了,key应该如何去设计,验证码是和手机号建立关系,所以,这个key应该和手机号搭关,这样整个key才能作为这个验证码的唯一标识,在实际工作中,通常在这个key前面加一个业务的前缀,将key变成这样的格式(就像是表里有一个字段),这样的格式有一个好处:

  • 现在手机号看似是唯一的一个值,但是如果某个项目的业务比较复杂,其他功能也需要通过手机号去保存缓存,那么这样用手机号作为key就有冲突了,现在的这个功能是要保存验证码,其他功能却不是保存验证码,这样就冲突了
    在这里插入图片描述

在项目中会使用到很多key的前缀,可以将这个模块抽象出来,在common文件夹中创建一个 cache_keys .py文件,这样就可以将每个业务,每个模块的key给区分出来,在工作中,设置key的标识是很重要的
这个是验证码的key的前缀,{}相当于占位符,使用format函数将内容放入{}中
在这里插入图片描述
回到logics .py文件中,将格式修改一下
在这里插入图片描述
这样就将验证码保存到缓存中,可以通过key来取

3. 初步加工登陆接口
  1. 回到apis .py文件中的登陆接口
  • 首先要将前端通过表单提交的手机号和验证码取出来,提取的时候给个默认值,万一前端没做好,传回来的数据为空,那么后台得到的是None,所以将默认值设为 ’ ',然后去空格,去玩空格后,如果获取的是手机号,则可以根据手机号去缓存中取到对应的验证码进行核对.否则就不会去取
  • 核对完验证码后,如果存在用户,就登陆,否则就创建用户,这里需要将伪代码修改一下
  • 设置登陆状态,返回user对象,返回的情况应该和业务相关,返回user对象,可能有一些信息,比如昵称,头像,就需要用户取填写(但是实际上返回的json都是dict类型,对象不能通过json.dump转化,所以还要对返回的user对象进行完善)
    在这里插入图片描述
4. 对user对象进行加工工作
  1. 在user文件夹下的models .py文件中,添加一个将数据转为字典的函数
    在这里插入图片描述
    这样就只需要在登陆接口中添加这个方法就行了
    在这里插入图片描述

  2. 接下来,万恶的产品经理过来跟你说,不能返回出生年月日,只要返回年龄就行了,为了减少接口数据量的传输,这个任务就压到你身上了,所以.就得修改上面定义的方法
    那么,如何计算年龄
    做日期的加减法,要用到datatime模块

  • 首先是获取当前的日期
    在这里插入图片描述
  • 用当前日期减去出生日期,得到的是天数
    在这里插入图片描述
    然后用天数除以365,就可以得到一个粗略的年龄
    在这里插入图片描述
    但是这样不准确,没有考虑到闰年,有时候这回令用户疑惑,没有到生日,就给人加了一岁,这是一个bug
    可以整理一下,作为面试中谈论的项目中解决问题的一个示例
    怎么解决这个问题呢?(很多问题需要自己想,想不出来就网上查看其他人优秀的方法)
    有一个方法,不用考虑闰年的问题,也能解决这个bug
    对取整得到的年龄先减一岁,判断当前月,日如果大于出生的月,日的话,说明他已经过了今年的生日,就给其加一岁
    在models .py中添加一个方法计算年龄
    在这里插入图片描述
    测试一下(模型中是由默认值的),能不能输出正确年龄
    在这里插入图片描述
    然而,在设计的角度来说,这个代码还是需要进行优化
    在这里插入图片描述
    age可以通过这样取访问,它是一个实例方法,在设计的角度来说,年龄应该是user的一个属性,所以这个实例方法在这里有点不合适,要将这个方法变为一个属性,使用装饰器
    在这里插入图片描述
    测试一下,可以发现现在就不能用实例方法来调用了,需要通过属性来调用
    在这里插入图片描述
5. 现在登陆接口就完成了,通过Postman工具进行测试

先通过手机号发送验证码,然后从pycharm控制台中获取验证码
在这里插入图片描述
将验证码填入,测试登陆接口
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值