测试平台系列(8) 与前端联调注册/登录接口(part 1)

简介: 与前端联调注册/登录接口(part 1)

与前端联调注册/登录接口(part 1)


前方高能

咱们今天讲的内容,可能和前端关联比较大,如果没有经验的同学,或者说只想专注后端的同学,你们直接copy前端的代码即可。

秉着毁人不倦的思想,笔者打算细讲一部分前端的内容,毕竟还有一部分读者是前后兼修的。

如果你们也想React相关知识,在我这里可能不能系统地学到,但是在 测试平台(序) 中也介绍了相关的前端学习建议和地址,希望大家恶补一下,毕竟这方面也不算难。

编写登录接口


与注册接口类似,甚至更加简单,先理一下思路:


用户通过页面(这里暂时还没有)输入用户名密码,点击登录按钮进行登录,如果成功的话则将用户信息放入返回即可。如果用户名或者密码不正确,则给出提示,拒绝让用户登录!

Talk is cheap, show me the code!


from datetime import datetime
from sqlalchemy import or_
from app.middleware.Jwt import UserToken
from app.models import db
from app.models.user import User
from app.utils.logger import Log
class UserDao(object):
    log = Log("UserDao")
    @staticmethod
    def register_user(username, name, password, email):
        """
        :param username: 用户名
        :param name: 姓名
        :param password: 密码
        :param email: 邮箱
        :return:
        """
        try:
            users = User.query.filter(or_(User.username == username, User.email == email)).all()
            if users:
                raise Exception("用户名或邮箱已存在")
            # 注册的时候给密码加盐
            pwd = UserToken.add_salt(password)
            user = User(username, name, pwd, email)
            db.session.add(user)
            db.session.commit()
        except Exception as e:
            UserDao.log.error(f"用户注册失败: {str(e)}")
            return str(e)
        return None
    @staticmethod
    def login(username, password):
        try:
            pwd = UserToken.add_salt(password)
            # 查询用户名/密码匹配且没有被删除的用户
            user = User.query.filter_by(username=username, password=pwd, deleted_at=None).first()
            if user is None:
                return None, "用户名或密码错误"
            # 更新用户的最后登录时间
            user.last_login_at = datetime.now()
            db.session.commit()
            return user, None
        except Exception as e:
            UserDao.log.error(f"用户{username}登录失败: {str(e)}")
            return None, str(e)


简单解释一下,我们这边新建了一个login的方法,接受参数是usernamepassword,接着我们通过orm筛选出第一条username与password匹配且没有被删除的用户。


注意: 如果这里没有这个用户的话,user变量会是None,所以我采用了判断None的方式


最后我们把该用户的最后登录时间改成了当前时间。然后提交到了orm的session,这句话等同于执行sql。

思考


我们在上一个接口里面,注册完用户以后哈,是没有返回User实例信息的,但是这个接口不同,用户登录以后,需要拿到用户的信息以及token给前端处理。

但是我们的用户实例并不是一个JSON对象,所以我们要为它做一些处理。

接着我们编写pity/handler/factory.py,目的是为了转换orm对象为dict


from datetime import datetime
class ResponseFactory(object):
    @staticmethod
    def model_to_dict(obj, *ignore: str):
        data = dict()
        for c in obj.__table__.columns:
            if c.name in ignore:
                # 如果字段忽略, 则不进行转换
                continue
            val = getattr(obj, c.name)
            if isinstance(val, datetime):
                data[c.name] = val.strftime("%Y-%m-%d %H:%M:%S")
            else:
                data[c.name] = val
        return data
    @staticmethod
    def model_to_list(data: list, *ignore: str):
        return [ResponseFactory.model_to_dict(x, *ignore) for x in data]

解释一下2个方法,第一个是将User此类实例转换为dict。由于orm实例都继承了db.Model类,所以他们都有table属性,也就有了相关字段的信息。


ignore参数是一个可变字符串参数,当我们遇到需要忽略掉的字段时,可以派上用场。

这里可以看到笔者针对datetime类对象做了特殊处理,这是因为JSON中没有对应的datetime格式,所以我们需要对他也进行转换。


剩下的字段,直接通过set key value的方式赋值给data字典即可。

model_to_list也比较简单,属于一个列表生成式,对每条orm实例都进行了转换,最终返回一个list(orm object)

编写route方法


最后我们就需要编写路由方法了,在pity/controller/auth/user.py新增如下方法:


@auth.route("/login", methods=['POST'])
def login():
    data = request.get_json()
    username, password = data.get("username"), data.get("password")
    if not username or not password:
        return jsonify(dict(code=101, msg="用户名或密码不能为空"))
    user, err = UserDao.login(username, password)
    if err is not None:
        return jsonify(dict(code=110, msg=err))
    user = ResponseFactory.model_to_dict(user, "password")
    token = UserToken.get_token(user)
    if err is not None:
        return jsonify(dict(code=110, msg=err))
    return jsonify(dict(code=0, msg="登录成功", data=dict(token=token, user=user)))

这边还是先判断了username和password是否为空的情况,其次调用了UserDaologin方法,返回user和err信息。


这里还有一个细节就是,我把用户的password给隐藏了


user = ResponseFactory.model_to_dict(user, "password")`

接着通过UserToken.get_token成功将对象转换成token,拿到token后返回了这样的对象:


{
  "code": 0,
  "data": {
    "user": {},
    "token": ""
  }
}

验证


依旧是熟悉的postman出场时间,简单地测试一下:

  • 密码错误的情形

1.jpg

image

  • 密码正确的返回

2.jpg

image

可以看到,最后登录时间也正常显示了,token也生成了,password也没有暴露。想起抖音上的一些文案:

婚期已定,父母满意,对我体贴.....


有一种未来可期的感觉。

求饶


今天好像干货比较多,看来没有足够的时间留给前端联调了,会在下一节补充起来吧,至于名字就也不改了吧。




相关文章
|
4月前
|
关系型数据库 MySQL 测试技术
【分享】AgileTC测试用例管理平台使用分享
AgileTC 是一个脑图样式测试用例管理平台,支持用例设计、执行与团队协作,帮助测试人员高效管理测试流程。
337 116
【分享】AgileTC测试用例管理平台使用分享
|
4月前
|
人工智能 数据可视化 测试技术
AI测试平台自动遍历:低代码也能玩转全链路测试
AI测试平台的自动遍历功能,通过低代码配置实现Web和App的自动化测试。用户只需提供入口链接或安装包及简单配置,即可自动完成页面结构识别、操作验证,并生成可视化报告,大幅提升测试效率,特别适用于高频迭代项目。
|
4月前
|
人工智能 测试技术 调度
写用例写到怀疑人生?AI 智能测试平台帮你一键生成!
霍格沃兹测试开发学社推出AI智能测试用例生成功能,结合需求文档一键生成高质量测试用例,大幅提升效率,减少重复劳动。支持自定义提示词、多文档分析与批量管理,助力测试人员高效完成测试设计,释放更多时间投入核心分析工作。平台已开放内测,欢迎体验!
|
4月前
|
人工智能 测试技术 项目管理
测试不再碎片化:AI智能体平台「项目资料套件」功能上线!
在实际项目中,需求文档分散、整理费时、测试遗漏等问题常困扰测试工作。霍格沃兹推出AI智能体测试平台全新功能——项目资料套件,可将多个关联文档打包管理,并一键生成测试用例,提升测试完整性与效率。支持套件创建、文档关联、编辑删除及用例生成,适用于复杂项目、版本迭代等场景,助力实现智能化测试协作,让测试更高效、更专业。
|
4月前
|
测试技术
自动化测试登录后的功能
在自动化测试的时候,往往许多功能需要登录以后才可以进行操作的,在这里我介绍一种方法,在登录以后将Cookies信息存入本地文件,在测试登录以后操作的时候再从本地文件把信息调出来存入Cookies
94 4
|
4月前
|
人工智能 自然语言处理 测试技术
AI测试平台的用例管理实践:写得清晰,管得高效,执行更智能
在测试过程中,用例分散、步骤模糊、回归测试效率低等问题常困扰团队。霍格沃兹测试开发学社推出的AI测试平台,打通“用例编写—集中管理—智能执行”全流程,提升测试效率与覆盖率。平台支持标准化用例编写、统一管理操作及智能执行,助力测试团队高效协作,释放更多精力优化测试策略。目前平台已开放内测,欢迎试用体验!
|
5月前
|
存储 人工智能 文字识别
从零开始打造AI测试平台:文档解析与知识库构建详解
AI时代构建高效测试平台面临新挑战。本文聚焦AI问答系统知识库建设,重点解析文档解析关键环节,为测试工程师提供实用技术指导和测试方法论
|
数据可视化 前端开发 测试技术
接口测试新选择:Postman替代方案全解析
在软件开发中,接口测试工具至关重要。Postman长期占据主导地位,但随着国产工具的崛起,越来越多开发者转向更适合中国市场的替代方案——Apifox。它不仅支持中英文切换、完全免费不限人数,还具备强大的可视化操作、自动生成文档和API调试功能,极大简化了开发流程。
|
7月前
|
Java 测试技术 容器
Jmeter工具使用:HTTP接口性能测试实战
希望这篇文章能够帮助你初步理解如何使用JMeter进行HTTP接口性能测试,有兴趣的话,你可以研究更多关于JMeter的内容。记住,只有理解并掌握了这些工具,你才能充分利用它们发挥其应有的价值。+
1158 23
|
9月前
|
SQL 安全 测试技术
2025接口测试全攻略:高并发、安全防护与六大工具实战指南
本文探讨高并发稳定性验证、安全防护实战及六大工具(Postman、RunnerGo、Apipost、JMeter、SoapUI、Fiddler)选型指南,助力构建未来接口测试体系。接口测试旨在验证数据传输、参数合法性、错误处理能力及性能安全性,其重要性体现在早期发现问题、保障系统稳定和支撑持续集成。常用方法包括功能、性能、安全性及兼容性测试,典型场景涵盖前后端分离开发、第三方服务集成与数据一致性检查。选择合适的工具需综合考虑需求与团队协作等因素。
1499 24

热门文章

最新文章

  • 1
    前端如何存储数据:Cookie、LocalStorage 与 SessionStorage 全面解析
    693
  • 2
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
    298
  • 3
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
    258
  • 4
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
    208
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
    311
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
    452
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
    198
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
    145
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
    212
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
    285