【Flask】测试平台开发实战-第二篇

 概述:

在上一篇我们已经将后端初始化服务后前端的vue框架初始化已经搭建完整,并且可以运行看到界面,服务正常,当然我们看到的前端数据都是mock下的假数据,并不是真实的,这篇我们来开发实现第一个功能,登录接口的打通开发实现(第一个简单的登录接口实现)

前端框架结构

├── build                      // 构建相关  
├── mock                       // 项目mock 模拟数据
├── public                     // 公共资源
├── src                        // 源代码
│   ├── api                    // 所有接口请求
│   ├── assets                 // 主题 字体等静态资源
│   ├── components             // 全局公用组件
│   ├── directive              // 全局指令
│   ├── filtres                // 全局 filter
│   ├── icons                  // 项目所有 svg icons
│   ├── router                 // 路由
│   ├── store                  // 全局 store管理
│   ├── styles                 // 全局样式
│   ├── utils                  // 全局公用方法
│   ├── vendor                 // 公用vendor
│   ├── views                  // view
│   ├── App.vue                // 入口页面
│   ├── main.js                // 入口 加载组件 初始化等
│   └── permission.js          // 权限管理

api :请求服务端接口的配置都在这里,这里逻辑实现是用到了utils里边的封装的request.js,其中在没有正式服务接口的之前是可以直接调用上边mock里的地址,得到模拟的数据请求。

views:页面的布局,样式,功能实现的地方,一般一个vue代表一个功能页面,具体根据自身项目逻辑划分就可以。

获取登录接口

终端切换到vue-element-admin目录,执行npm run dev 编译并开发者模式运行,这里和依赖环境中启动方式保持一致即可;

用chrome打开,进入登录页面,并依次浏览器菜单-更多工具-开发者工具,进入调试模式,切换到查看网络,来查看在登录网络请求

输入admin,任意密码,点击Login,正常进入主页后我们会分别看到两个登录相关接口login 和 info,请求Request URL分别为:

http://172.16.60.60:9527/dev-api/vue-element-admin/user/login 方法post

对应返回结果如下:

{"code":20000,"data":{"token":"admin-token"}}
http://172.16.60.60:9527/dev-api/vue-element-admin/user/info?token=admin-token

get请求如下

返回结果如下:

其实这个如果在/mock/user.js也能通过代码看到,登录接口的内容。

实现登录接口

既然已经知道登录接口的请求以及重要的返回值,那么我们就可以用flask实现这两个接口,一个是登录验证用户存在返回token,另一个是登录成功后获取用户信息。

[POST] /user/login

  1. 编写代码: app.py 或者你顺手的编辑器

# -*- coding: utf-8 -*-from flask import Flaskfrom flask import requestimport jsonapp = Flask(__name__)@app.route("/api/hello")def hello():return "Hello, World!"@app.route("/api/user/login",methods=['POST'])
def login():data = request.get_data() # 获取post请求body数据js_data = json.loads(data) # 将字符串转成json# 验证如果是admin用户名,即登录成功,返回admin的token,否则验证失败if 'username' in js_data and js_data['username'] == 'admin':result_success = {"code":20000,"data":{"token":"admin-token"}}return result_successelse:result_error = {"code":60204,"message":"账号密码错误"}return result_errorif __name__ == "__main__":app.run(debug = True)
  1. 测试:运行python app.py 通过后 curl 或者 postman进行请求测试

1)登录成功

curl -X POST http://127.0.0.1:5000/api/user/login -d '{"username":"admin","password":"123456"}'
  1. 非admin登录错误

curl -X POST http://127.0.0.1:5000/api/user/login -d '{"username":"root","password":"654321"}'

[GET] /user/info

  1. 继续追加实现代码

@app.route("/api/user/info",methods=['GET'])def info():# 获取GET中请求token参数值token = request.args.get('token')if token == 'admin-token':result_success = {"code":20000,"data":{"roles":["admin"],"introduction":"I am a super administrator","avatar":"https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif","name":"Super Admin"}}return result_successelse:result_error = {"code": 60204, "message": "用户信息获取错误"}return result_error
  1. 继续测试

curl 'http://127.0.0.1:5000/api/user/info?token=admin-token'

到此后端代码用户登录逻辑接口实现完了,我们可以保持后端服务运行,然后让我们将前端的请求从mock切换成我们自己的服务,在原有代码中补充我们写的代码

完整代码如下:

# -*- coding: utf-8 -*-from flask import Flaskfrom flask import requestimport jsonapp = Flask(__name__)@app.route("/api/hello")def hello():return "Hello, World!"@app.route("/api/user/login",methods=['POST'])
def login():data = request.get_data() # 获取post请求body数据js_data = json.loads(data) # 将字符串转成json# 验证如果是admin用户名,即登录成功,返回admin的token,否则验证失败if 'username' in js_data and js_data['username'] == 'admin':result_success = {"code":20000,"data":{"token":"admin-token"}}return result_successelse:result_error = {"code":60204,"message":"账号密码错误"}return result_error@app.route("/api/user/info",methods=['GET'])def info():# 获取GET中请求token参数值token = request.args.get('token')if token == 'admin-token':result_success = {"code":20000,"data":{"roles":["admin"],"introduction":"I am a super administrator","avatar":"https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif","name":"Super Admin"}}return result_successelse:result_error = {"code": 60204, "message": "用户信息获取错误"}return result_errorif __name__ == "__main__":app.run(debug = True)

请求正式服务接口

  1. 修改接口请求地址

路径 vue-element-admin/src/api/user.js ,进行打开编辑, 配置成自己写的请求的api地址( 注释掉的就是原来mock地址)

export function login(data) {return request({// url: '/vue-element-admin/user/login',url: '/api/user/login',method: 'post',data})}export function getInfo(token) {return request({// url: '/vue-element-admin/user/info',url: '/api/user/info',method: 'get',params: { token }})
}

  1. 修改一个请求域名

另外还需要修改一下默认的域名地址,文件位于根目录.env.development 里边一项改成,这里只暂时dev配置环境的。

VUE_APP_BASE_API = 'http://127.0.0.1:5000/'

  1. 运行测试

重新启动运行前端,尝试登录,查看登录状态和chrome调试模式的请求返回,你会发现并没有成功,看flask日志输出显示类似 "OPTIONS /api/user/login HTTP/1.1" 200 提示,这是由于跨域问题,简单说就是浏览器一种安全机制,至于详细的后续单独再说,这里先一个通用解决办法就是在python flask中允许跨域就好了。

跨域解决

  1. 安装python依赖包flask-cors

pip install flask-cors
  1. 头部引用

 from flask_cors import CORS  
  1. 允许代码

app = Flask(__name__)
CORS(app, supports_credentials=True)

最终联调

重新运行后端服务 python run.py

重新运行前端服务 npm run dev

输入 admin / 123456 进行登录

OK 前后端联调成功

好了,到此我们一个简单的登录流程就实现了,当然这只是一个很简单的登录接口流程,目的是为了让你掌握如何实现前端和后端接口登录的一个实现过程,后期我们会将登录这里进行重构使用更加保密的方式,密码通过Md5或者哈希的方式进行加密,这种方式才是我们目前所有市面上使用的通过登录功能,当然不着急,还是那句话,勋勋渐进,慢慢一步一步走。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/94818.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/94818.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

聊一聊 .NET 的 AssemblyLoadContext 可插拔程序集

一:背景 1. 讲故事 最近在分析一个崩溃dump时,发现祸首和AssemblyLoadContext有关,说实话这东西我也比较陌生,后来查了下大模型,它主要奔着替代 .NetFrameWork 时代的 AppDomain 的,都是用来做晚期加卸载&a…

Java中使用Spring Boot+Ollama实现本地AI的MCP接入

目录结构完善spring bootpom.xml添加依赖application.ymlMCP 工具配置 mcp-servers.json配置类编写API在我的上一篇文章搭建好本地的聊天机器人后,准备接入MCP进一步增强AI的能力,以实现类似手机AI的功能 参考的是第二篇文章链接其内容比较精炼&#x…

C#正则表达式与用法

🌟 C# 常用正则表达式与用法C# 使用正则需要引用命名空间:using System.Text.RegularExpressions; 常用方法:Regex.IsMatch(input, pattern) → 返回 bool,用于验证Regex.Match(input, pattern) → 返回 Match 对象,可…

从0开始学习Java+AI知识点总结-27.web实战(Maven高级)

一、分模块设计与开发:让项目结构更清晰1.1 为什么需要分模块?单模块开发的痛点在小型项目中,单模块(所有代码放在一个工程)或许能满足需求,但项目规模扩大后会出现两大核心问题:维护成本高&…

Ferris Wheel (贪心 | 双指针)

题目:思路:本题注意题目的条件即可,题意说一个摩天轮可以坐一个人或者两个人,那么显然我们就可以贪心一下具体的,我们可以让最小的去匹配最大的,如果此时大于 x,那么显然我们根本无法使得 最大的…

课程视频怎么加密?在线教育机构常用的6个课程加密方法

知识付费时代,课程视频是教育机构的核心资产。但是不难发现,课程视频的安全却得不到保障。各大购物平台搜索课程名称,便出现了许多盗版课程。如何有效防止课程被翻录和二次传播,成为急需解决的关键问题。今天这期分享点干货&#…

SOME/IP-SD中”服务器服务组播端点”、“客户端服务组播端点”与“IPv4组播选项的区分

<摘要> AUTOSIP-SD协议中组播端点&#xff08;Multicast Endpoint&#xff09;在不同上下文中的角色与表述差异。准确理解“服务器服务组播端点”、“客户端服务组播端点”与“IPv4组播选项”中配置的端点之间的关系&#xff0c;是正确实现组播事件分发机制的关键。这涉及…

计算机是如何运行的

目录 一&#xff0c;计算机是如何组成的 1.1&#xff0c;CPU中央处理单元 1.1.1&#xff0c;CPU的构成和属性 1.1.2&#xff0c;如何判断cpu的好坏 1.1.3&#xff0c;指令 1.1.4&#xff0c;CPU的缓存 1.2&#xff0c;操作系统 1.2.1&#xff0c;进程 1.2.2&#xff0…

JavaScript性能优化:实战技巧与高效策略

JavaScript性能优化实战技术文章大纲性能优化的重要性解释为什么性能优化对用户体验和业务指标至关重要列举常见性能问题的影响&#xff08;如跳出率、转化率下降&#xff09;代码层面的优化减少全局变量使用&#xff0c;避免内存泄漏使用事件委托减少事件监听器的数量避免频繁…

解决.env.production 写死 IP 的问题:Vue + config.json 运行时加载方案

背景&#xff1a;前端常用 .env.production 在构建时写死 API 地址 场景&#xff1a;运维部署时经常不知道目标主机 IP/域名 问题&#xff1a;每次 IP 变动都要重新编译 → 增加运维成本 引出需求&#xff1a;只修改 IP 就能完成部署&#xff0c;不需要重新打包 目录一、解决方…

如何从三星手机转移到另一部三星手机

三星Galaxy S系列因其出色的设计、令人惊叹的显示屏、惊艳的摄像头、更好的扬声器以及创新的指纹传感器而受到大多数用户的欢迎&#xff0c;获得了良好的声誉。让用户感到满意的是&#xff0c;三星Galaxy S10拥有更美观的设计、令人惊叹的显示屏、令人惊叹的摄像头、更好的扬声…

聚焦建筑能源革新!安科瑞 “光储直柔” 方案护航碳中和目标实现

1、背景在 “双碳” 目标引领下&#xff0c;能源结构转型与建筑能效提升成为重要课题。清华大学江亿院士提出的 “光储直柔” 新型配电系统&#xff0c;为建筑领域绿色发展提供了创新方向。光储直柔得到了业界广泛认同和积极响应&#xff0c;国家、各部委、地区陆续出台相关政策…

Shell 中 ()、(())、[]、{} 的用法详解

文章目录Shell 中 ()、(())、[]、{} 的用法详解一、先明确&#xff1a;四类符号的核心功能定位二、逐个拆解&#xff1a;用法、示例与避坑点1. ()&#xff1a;子 Shell 执行&#xff0c;隔离环境核心用法1&#xff1a;子 Shell 执行命令&#xff0c;隔离变量核心用法2&#xff…

开发避坑指南(41):Vue3 提示框proxy.$modal.msgSuccess()提示文本换行解决方案

需求 由于接口返回的提示信息过长&#xff0c;接口已经在返回提示中加入换行标签了&#xff0c;但是使用proxy.modal.msgSuccess(res.msg)提示没有换行&#xff0c;那么Vue3中proxy.modal.msgSuccess(res.msg)提示没有换行&#xff0c;那么Vue3 中 proxy.modal.msgSuccess(res.…

[Sync_ai_vid] 唇形同步推理流程 | Whisper架构

链接&#xff1a;https://github.com/bytedance/LatentSync/blob/main/docs/syncnet_arch.md docs&#xff1a;LatentSync LatentSync是一个端到端唇语同步项目&#xff0c;能够生成语音与唇形完美匹配的逼真视频。 该项目通过使用*音频条件化3D U-Net*&#xff08;一种生成式…

uniapp中 ios端 scroll-view 组件内部子元素z-index失效问题

发现子组件中的弹窗在ios手机上会被限制在scroll-view里面&#xff0c;安卓手机上不受限制&#xff0c;网上找了好久原因 scroll-view组件内部设置了 -webkit-overflow-scrolling: touch 样式&#xff0c;导致z-index失效&#xff08;safari 3D变换会忽略z-index的层级问题&…

PyTorch图像预处理完全指南:从基础操作到GPU加速实战

引言 图像预处理是模型性能的"隐形基石"&#xff0c;在计算机视觉任务中直接决定模型能否提取有效特征。科学的预处理流程能让基础模型性能提升15%以上&#xff0c;而GPU加速预处理可使数据准备阶段耗时降低60%以上。本文将聚焦PyTorch预处理核心技术&#xff0c;从基…

【前端教程】 CSS浮动布局解析与优化:从基础实现到工程化改进

浮动(float)是CSS中实现页面布局的经典技术,虽然现代布局更多使用Flexbox和Grid,但理解浮动的工作原理仍是前端开发者的基础素养。本文以一个三栏浮动布局的代码为例,从布局原理解析、潜在问题诊断、工程化优化三个维度,带你深入理解浮动布局的精髓与优化思路。 一、原代…

DVWA靶场通关笔记-暴力破解(Impossible级别)

目录 一、查看源码 二、功能分析 三、SQL注入分析 1、使用PDO预处理语句和参数绑定 2、mysqli_real_escape_string转义 3、stripslashes去除反斜杠 四、暴力破解分析 1、token防止暴力破解机制 2、登录失败随机延迟机制 3、登陆失败报错信息相同 4、登陆失败的账户…

IAR工程如何生成compile_commands.json文件(能生成但是clangd不能生成“.cache文件”)

最近一直在使用vscodeclangd的方式编写代码&#xff0c;感觉使用clangd查找函数调用、函数声明、类型定义等等都比使用vscode自带的c/c插件好用太多了。现在我有一个功能是IAR版本的&#xff0c;那么有没有办法生成clangd使用的compile_commands.json文件呢&#xff1f;答案是&…