Flask后端开发(一)-基础知识和前期准备
目录
- 1.背景介绍
- 1.1. 项目背景
- 1.2. 项目难点
- 1.3. 项目环境
- 2. flask后端开发实现的功能
- 3. flask部署和前后端对接
- 3.1. flask运行配置和服务器部署
- 3.2. flask前后端传参
- 4. 后端测试工具
- 4.1. 工具介绍
- 4.2. 工具使用
- 后记
1.背景介绍
1.1. 项目背景
就是前几个月临时接手了一个后端项目,使用python flask框架进行后端开发,整个项目开发内容相对简单,主要是文件读取和修改,没有用上数据库操作,主要实现的功能点包括:
- 根据网页端的参数数值,修改对应文件的参数值;
- 展示oai运行的结果,返回给前端;
- 使用python编程语言远程连接服务器,多线程运行liunx命令,从而运行oai代码和matlab代码。
- 实时读取liunx命令的命令行输出,返回给前端做展示;
- 随时终止命令行执行;
这篇文章将会梳理我在这个项目开发过程中的学习收获,欢迎交流!
1.2. 项目难点
- 前后端对接;
- 修改本地文件,包括
.mlx
这类动态脚本文件; - 查找文件内容,并修改对应参数;
- python语言远程连接服务器并执行命令;
- 命令行输出实时读取并展示;
- 后端代码调试手法(小白第一次搞后端嘛
1.3. 项目环境
- flask 2.3.3
- gunicorn 20.0.4
- python 2.7.18
- MobaXterm_Personal 23.2
- Ubuntu 20.04.6 LTS ( GNU/Linux 5.4.0-163-lowlatency x86_64)
2. flask后端开发实现的功能
- 修改文件参数值——根据网页端的参数数值,修改对应文件的参数值
- 获取网页端传参
- 读取对应文件:包括普通的程序文档以及mlx文件;
- 查找对应修改位置,替换数据
- 读取结果数据——展示oai运行的结果,返回给前端;
- 文件结果如何存储;
- 读取对应文件,构建参数返回给前端;
- 运行liunx命令行——使用python编程语言远程连接服务器,多线程运行liunx命令,从而运行oai代码和matlab代码。
- 远程连接服务器
- python语言多线程执行liunx命令
- 实时读取liunx命令的输出数据
- 终止命令执行
3. flask部署和前后端对接
3.1. flask运行配置和服务器部署
-
flask安装
- 打开cmd窗口,如果已经部署了python环境,则使用如下命令安装flask对应包
pip install flask
- 打开cmd窗口,如果已经部署了python环境,则使用如下命令安装flask对应包
-
flask基本框架
-
最简单的flask框架如下所示:
from flask import Flask app = Flask(__name__)@app.route('/') def hello_world():return 'Hello World'if __name__ == '__main__':app.run()
-
对于需要分模块进行操作的flask框架,基本文件框架如下所示:
对于主文件app.py
,文件结构如下:# 导入包 from flask import Flask from flask_bootstrap import Bootstrap from module1.index import *#这部分从子模块导入全部代码文件 from module2.index import * from module3.index import * from module4.index import * from flask_cors import CORS# 创建实例 app = Flask(__name__) bootstrap = Bootstrap(app)# 引用子模块 app.register_blueprint(model1_name, url_prefix="/module1_name") app.register_blueprint(model2_name, url_prefix="/module2_name") app.register_blueprint(model3_name, url_prefix="/module3_name") app.register_blueprint(model4_name, url_prefix="/module4_name")@app.route("/") def index():return "Hello World!"if __name__ == "__main__":app.debug = True # 设置调试模式,生产模式的时候要关掉debugapp.run(host='127.0.0.1', port=5000) # 启动服务器
对于每个模块下的子文件
index.py
,文件结构如下:from flask import Blueprint, jsonify, request, Flask, render_template from markupsafe import escapemodel1_name = Blueprint("/model1_name", __name__)#这个是为了和主文件的连接部分进行对接# GET - 从指定的资源请求数据。 POST - 向指定的资源提交要被处理的数据。 @model1_name.route("/function1", methods=["POST","GET"]) def function1():#to do somethingreturn jsonify({"Success": "成功参数"})@model1_name.route("/function2", methods=["POST"]) def function2():#to do something return jsonify({"Success": "成功参数"})def global_function():#这里可以设置一些公共函数,前面的function函数可以调用这些公共函数,简化代码形式#to do
-
-
flask运行
将整个项目存储于某个文件夹之后,运行方式有如下几种:- 通过vscode打开项目,运行app.py文件
- cmd窗口进入该项目文件夹,使用python app.py运行;
- cmd窗口进入该项目文件夹,使用flask run方式运行;(只针对主文件为app.py的项目)
-
flask服务器部署
- 将flask文件复制一份到服务器上,配置flask运行环境
- ip端口部署:安装gunicorn
- 参考博客:python之gunicorn的配置 - 倥偬时光 - 博客园
- 安装:
pip install gunicorn
- 运行:
gunicorn -b ip地址:端口 app:app
- 部署之后:
- ip端口部署之后,前端可以根据指定的 ip地址:端口访问后端项目。
- 重新部署或者接口占用的解决方式:
lsof -i:端口号
:显示端口占用的线程kill -9 线程序号
:杀死线程gunicorn -b ip地址:端口 app:app
:重新部署端口
3.2. flask前后端传参
-
前端的数据传递
- 前端通过GET\POST等协议传递数据给后端,通俗来解释一下:
-
GET将参数放在网址参数中,类似于如下形式
https://account.bilibili.com/big?spm_id_from=333.999.0.0
【key=value 形式传参】:“spm_id_from=333.999.0.0”就是通过GET方式进行数据传输。 -
POST将数据打包之后再传给后端,类似于如下形式(json格式):
{
“password”:“12334”,
“username”:“crazypixel”,
…
}
【body传参】:数据有名称和具体值,打包之后发送出去
-
- 前端通过GET\POST等协议传递数据给后端,通俗来解释一下:
-
后端的数据接收
-
flask后端框架中,在方法定义时有method变量
@model1_name.route(“/function2”, methods=[“POST”])
这里的methods=[“GET”,“POST”]就表示后端接口能支持GET\POST两种数据传输方法,而methods=[“POST”]则不支持GET方法,只支持POST方法 -
本项目中主要使用flask.request库进行数据接收,具体代码如下所示:
#前期方法库引入 from flask import request ## 一般写法 if request.method == "POST":userID= request.form.get("userID") elif request.method == "GET":userID= request.args.get("userID")#列表分割,传递数据为:{"RNTI":"1,2,3"} if request.method == "POST":RNTI= request.form.get("RNTI").split(",")#得到列表[1,2,3]
关于flaks.request库,简单总结:
request.form.get("key", type=str, default=None) 获取表单数据 request.args.get("key") 获取get请求参数 request.values.get("key") 获取所有参数
可参考链接:https://foofish.net/flask_requset_form_data_json.html
-
4. 后端测试工具
4.1. 工具介绍
测试需求:模拟前端请求,发送对应数据给后端
工具:apipost/postman
工具介绍:Apipost使用教程
4.2. 工具使用
下面主要介绍我使用apipost这个工具涉及到的功能:
在参数项设置部分,可以选择导入参数,提前准备好测试样例,然后直接导入。
整体测试流程如下:
- 运行后端代码;
- 建立测试项目,进行参数设置;
- 点击“发送”,模拟前端向后端发送请求;
- 根据后端返回结果进行功能测试和代码调试。
后续还有功能实现相关代码,待补充ing…
后记
如果觉得我写得不错,不妨点赞关注一波走起~
想看更多博文,可以访问我的博客主页: 博客园 / CSDN / 51CTO / 掘金论坛 / 知乎
相关文章:

Flask后端开发(一)-基础知识和前期准备
目录 1.背景介绍1.1. 项目背景1.2. 项目难点1.3. 项目环境 2. flask后端开发实现的功能3. flask部署和前后端对接3.1. flask运行配置和服务器部署3.2. flask前后端传参 4. 后端测试工具4.1. 工具介绍4.2. 工具使用 后记 1.背景介绍 1.1. 项目背景 就是前几个月临时接手了一个…...

基于SSM的幼儿园管理系统
基于SSM的幼儿园管理系统的设计与实现~ 开发语言:Java数据库:MySQL技术:SpringSpringMVCMyBatis工具:IDEA/Ecilpse、Navicat、Maven 系统展示 登录界面 管理员界面 摘要 基于SSM(Spring、Spring MVC、MyBatis&#…...

互联网Java工程师面试题·Spring篇·第三弹
目录 编辑 4、注解 4.1、什么是基于注解的容器配置 4.2、如何在 spring 中启动注解装配? 4.3、Component, Controller, Repository,Service 有何区别? 4.4、Required 注解有什么用? 4.5、Autowired 注解有什么用? 4.6、…...

前端(二十三)——轮询和长轮询
😫博主:小猫娃来啦 😫文章核心:实现客户端与服务器实时通信的技术手段 文章目录 前言轮询技术轮询的概念轮询的实现原理轮询的优缺点轮询的使用场景 长轮询技术长轮询的概念长轮询的实现原理长轮询的优缺点长轮询的使用场景 轮询与…...

uniapp把文件中的内复制到另一个文件中
使用的是Html 5的plus.io.resolveLocalFileSystemURL方法,文档:HTML5 API Reference var soursePath file:///storage/emulated/0/a/;//用于读取var removePath file:///storage/emulated/0/w/;//用于移除w这个文件夹var targetPath file:///storage/…...

什么是蓝桥杯?什么是蓝桥STEMA考试?
第十五届蓝桥大赛赛事安排? STEMA考试11月(考试时间11月26日) STEMA考试1月(2024年1月) STEMA考试3月(2024年3月) 第十五届蓝桥杯省赛(2024年4月待定) 第十五届蓝桥杯国赛(2024年5月待定) 注:以上时间具体以组委会官方发布为准。 01.蓝桥杯 蓝桥杯全国软件和…...
快递排序Java
快速排序是在工具类常用的排序算法,快速排序的思想主要是选定一个基准元素,然后找到基准元素的位置,然后再分别排序他左边的和他右边的,快速排序是不稳定的,时间复杂度位Nlog(N),最极端的情况就是一个反向排好顺序的数组ÿ…...

Spark简单回顾
星光下的赶路人star的个人主页 大鹏一日同风起,扶摇直上九万里 文章目录 1、Spark1.1 Spark入门1.1.1 Spark部署模式1.1.2 常用端口 1.2 SparkCore1.2.1 RDD不可变和五大属性1.2.2 RDD的弹性1.2.3 cache和Checkpoint的区别1.2.4 算子 1.3 SparkSQL1.4 内核1.4.1提交…...

DDD与微服务的千丝万缕
一、软件设计发展过程二、什么是DDD?2.1 战略设计2.2 战术设计2.3 名词扫盲1. 领域和子域2. 核心域、通用域和支撑域3. 通用语言4. 限界上下文5. 实体和值对象6. 聚合和聚合根 2.4 事件风暴2.5 领域事件 三、DDD与微服务3.1 DDD与微服务的关系3.2 基于DDD进行微服务…...

S32K324 UDS Bootloader开发-需求篇
文章目录 前言内存分配UDS诊断协议需求CAN ID及时间参数UDS诊断服务Bootloader诊断服务APP诊断服务 DID22服务的DID:2E服务的DID:Routine Control DID: 刷写流程预编程主编程后编程 总结 前言 之前做过一个STM32的UDS Bootloader,协议栈主要是NXP官网下…...
【前端设计模式】之调停者模式(中介者模式)
调停者模式是一种行为设计模式,它通过引入一个调停者对象来集中处理一组对象之间的交互。调停者模式的目标是减少对象之间的直接通信,从而降低耦合度,并且使代码更易于维护和扩展。 调停者模式特性 将对象之间的通信集中在一个调停者对象中…...

【MySQL架构篇】SQL执行流程与缓冲池
文章目录 1. SQL执行流程2. 数据库缓冲池(Buffer Pool)2.1 缓冲池概述2.2 缓冲池如何读取数据2.3 查看和设置缓冲池的大小2.4 多个Buffer Pool实例2.5 引申问题 1. SQL执行流程 查询缓存:因为查询效率往往不高,所以在MySQL8.0之后就抛弃了这个功能解析器…...

[support2022@cock.li].faust、[tsai.shen@mailfence.com].faust勒索病毒数据怎么处理|数据解密恢复
引言: 威胁网络安全的恶意软件不断涌现,而[support2022cock.li].faust勒索病毒则是其中的一员。这个网络黑暗角落的新星,以其数据绑架的方式,一度成为数据安全的威胁焦点。本文将探究[support2022cock.li].faust勒索病毒的运作方…...
力扣学习笔记——49. 字母异位词分组
49. 字母异位词分组 https://leetcode.cn/problems/group-anagrams/?envTypestudy-plan-v2&envIdtop-100-liked 给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。…...

五、Qt中的常用类
1. QString 字符串类 QString是Qt中的字符串类,与C/C不同的是,不再使用ASCII编码,而使用Unicode编码。因此一个字符不是8位的char,而是16位的QChar,这就是为什么之前一个汉字占用一个字符的原因。、 QString几乎向前兼…...

CentOS 7.9.2009 数据盘挂载
一、linux版本: lsb_release -a 二、操作步骤 2.1,查看磁盘挂载情况,确认sdb是需挂载的硬盘 ## 查看磁盘挂载情况,确认sdb是需挂载的硬盘 lsblk 2.2,对硬盘sdb进行分区 ## 对硬盘sdb进行分区 fdisk /dev/sdb# 命令…...
cv::solvePnP使用方法及注意点详解(OpenCV/C++)
cv::solvePnP(objectPoints, imagePoints, cameraMatrix, distCoeffs, rvec, tvec, useExtrinsicGuess, flags); 1、参数说明: objectPoints:一个 vector<cv::Point3f>,包含了在世界坐标系中的三维点的坐标,至少需要4个点…...

DevOps持续集成-Jenkins(4)
❤️作者简介:2022新星计划第三季云原生与云计算赛道Top5🏅、华为云享专家🏅、云原生领域潜力新星🏅 💛博客首页:C站个人主页🌞 💗作者目的:如有错误请指正,将…...
【数据仓库-零】数据仓库知识体系 ing
文章目录 一. 数仓基本概念二. 离线数仓建设方法论三. etl流程四. 数仓规范建设指南四. 数据仓库架构五. 数据可视化 通过熟悉构建数仓整体的过程,可以系统的了解 数仓构建理论:能够站在全局角度看数仓的运行架构,数仓执行流程。了解到构建数…...
css3 3D 转换 技巧详细解析与代码实例
CSS3 3D转换是CSS3中的一项新特性,通过它我们可以比较容易地实现3D效果。在这里,我将向大家介绍CSS3 3D转换的一些基本概念、使用方法和常见技巧。 1. 基本概念 在使用CSS3 3D转换时,需要了解一些基础概念: 三维坐标系…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...

分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...

STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...

算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...