【SH】在Ubuntu Server 24中基于Python Web应用的Flask Web开发(实现POST请求)学习笔记
文章目录
- Flask
- 开发环境搭建
- 保持Flask运行
- Debug调试
- 路由和视图
- 可变路由
- 请求和响应
- 获取请求信息
- Request属性
- 响应状态码
- 常见状态码
- Cookie
- Session
- 表单
- GET请求
- POST请求
Flask
在用户使用浏览器访问网页的过程中,浏览器首先会发送一个请求到服务器,服务器接收到请求之后,会将请求转交给Flask进行处理。Flask会对用户所访问的URL进行解析,然后找到相应的响应内容,将其返回到浏览器。
开发环境搭建
参考文档:【SH】Ubuntu Server 24搭建Web服务器访问Python程序研发笔记
保持Flask运行
开启Ubuntu服务器,切换到项目目录,激活虚拟环境,运行app.py文件。如果开启了debug=True参数,只需要启动一次,后续更改了app.py文件后会自动重启,挺方便的,当然如果修改后运行失败,重启也会失败的。😄
sh@sheephero:~$ cd dip_project/
sh@sheephero:~/dip_project$ source dipenv/bin/activate
(dipenv) sh@sheephero:~/dip_project$ python app.py
app.py文件:
from flask import Flaskapp = Flask(__name__)@app.route("/")
def index():return "<h1>Hello World!</h1>" if __name__=='__main__':# 运行Flask应用,监听默认端口5000app.run(debug=True, host='0.0.0.0')
运行情况:

Debug调试
当Python程序运行出现出错的时候,就会出现如下界面,非常方便开发者进行调试!


路由和视图
仔细观察app.py 中的代码,hello 函数被 @app.route("/") 装饰器装饰,该装饰器用于定义路由,确定URL与Python函数之间的映射。而被装饰的hello函数便是视图函数,用于返回用户请求URL的响应内容。
可变路由
装饰器这部分,可以用<>定义一个可变参数,同时在视图函数()中添加这个参数,便可以设置动态路由,动态响应。
from flask import Flaskapp = Flask(__name__)@app.route("/")
def index():return "<h1>Hello World!</h1>"@app.route("/user/<name>")
def user(name):return "<h1>Hello, {}!</h1>".format(name)if __name__=='__main__':# 运行Flask应用,监听默认端口5000app.run(debug=True, host='0.0.0.0')


请求和响应
HTTP的核心就是【请求】和【响应】,其性质为无状态协议,对事务处理没有记忆能力。这意味着每一次交互都是完全独立的。
获取请求信息
路由和视图函数部分代码:
@app.route("/info")
def info():# 从request对象中获取用户请求信息info_str = f"""用户IP:{request.remote_addr} <br/>请求方式:{request.method} <br/>请求表单:{request.form} <br/>用户浏览器:{request.user_agent} <br/>用户Cookie:{request.cookies} <br/>"""return info_str
Request属性
| 属性名称 | 数据类型 | 说明 |
|---|---|---|
| method | str | 请求的提交方式 |
| path | str | URL中的访问路径 |
| full_path | str | URL中的访问路径,包含数据 |
| remote_addr | str | 浏览器的IP地址 |
| url | str | 请求的完整URL |
| base_url | str | 请求的URL,不含数据 |
| url_root | str | 请求的根URL,不含路径 |
| user _ agent | str | 浏览器及操作系统信息 |
| args | dict | 请求中提交表单的GET参数 |
| form | dict | 请求中提交表单的POST参数 |
| files | dict | 请求提交所上传的文件 |
| cookies | dict | 浏览器Cookie数据 |
响应状态码
每次的HTTP交互中,都会响应状态码。通过浏览器的F12可以查看响应状态码。
路由和视图函数部分代码:
@app.route("/user/<name>")
def user(name):if name in ['世界','羊大侠','SheepHero']:return "<h3>Hello, {}!</h3>".format(name) # 正常响应默认200else:return f'用户 {name} 不存在!', 404

常见状态码
| 状态码 | 信息 | 说明 |
|---|---|---|
| 200 | OK | 一切正常 |
| 301 | Moved Permanently | 重定向 |
| 400 | Bad Request | 客户端请求错误 |
| 403 | Forbidden | 无权限访问 |
| 404 | Not Found | 找不到页面 |
| 405 | Method Not Allowed | 客户端使用了不支持的提交方法 |
| 500 | Internal Server Error | 服务器端出错 |
| 502 | Bad Gateway | 代理与服务器之间访问出错 |
Cookie
HTTP每次的交互都是独立的,无法存储状态数据,Cookie就是为了解决这个问题。
Cookie的存储容量有限,一般不会超过4KB。因此,Cookie只能存储少量数据,如用户的一些偏好设置、临时信息等。当用户访问需要记录状态数据的网页时,服务器会在HTTP响应包头部加入设置Cookie的指令,浏览器接收到响应包后,将Cookie存储到本地,当用户再次访问页面时,浏览器会将Cookie数据加入HTTP请求包头部,从而使服务器获取到状态信息。
由于Cookie是存放在本地的,可以被查看及修改,安全性较低,所以一般不用来存储敏感数据。
from flask import Flask, request, make_response
import timeapp = Flask(__name__)@app.route('/visit')
def visit():# 从Cookie获取最后访问时间last_visit_time = request.cookies.get('last_visit_time', '首次访问')resp = make_response(f'最后访问的时间:{last_visit_time}')# 获取服务器当前时间并设置Cookielast_visit_time = time.strftime('%Y-%m-%d %H:%M:%S')# max_age用户设置Cookie的有效期(秒)resp.set_cookie('last_visit_time', last_visit_time, max_age=86400)return respif __name__=='__main__':# 运行Flask应用,监听默认端口5000app.run(debug=True, host='0.0.0.0')

同样的,在浏览器里面按【F12】点击Network,点击Cookies就可以查看Cookies信息。
在没有设置Cookie过期时间的情况下,当用户关闭浏览器(Chrome)时,Cookie将会被自动清除。

Session
Session与Cookie的作用相似,都用于存储状态数据。不同的是,Session只能在服务器端进行管理,用户在本地无法对其进行修改,因而安全性较高。Session一般用于存储用户登录状态等对安全性要求较高的信息。
为了保证数据的安全性,Session一般有以下两种存储方式。
(1). 使用Cookie记录一个随机生成的session_id,session_id用于记录Session与用户的映射关系,所有数据存储于服务器端,用户无法修改数据。
(2). 所有Session数据都在服务器端加密,然后存储在浏览器的Cookie中,若用户拥有加密算法及密钥,则Session数据可以被用户修改。(Flask默认以这种方式存储Session)
from flask import Flask, session
import timeapp = Flask(__name__)# 在使用Session之前,需要初始化 SECRET_KEY
app.config['SECRET_KEY'] = 'SheepHero' # 自定义
@app.route('/sign_in')
def sign_in():# 设置Session持久性存储数据,关闭浏览器记录还会保存在服务器中session.permanent = True# 从Session获取最后的签到时间及签到次数sign_in_time = session.get('sign_in_time','首次访问')sign_in_count = session.get('sign_in_count', 0)# 设置Session字典session['sign_in_time'] = time.strftime('%Y-%m-%d %H:%M:%S')session['sign_in_count'] = sign_in_count + 1ret_str = f'上次签到时间:{sign_in_time} <br/> 这是第 {sign_in_count} 次签到'return ret_strif __name__=='__main__':# 运行Flask应用,监听默认端口5000app.run(debug=True, host='0.0.0.0')
有了Session,便可以实现安全的用户状态数据保存,从而实现登录功能。

表单
通过表单让用户和服务器进行数据交互。
from flask import Flask, request
import time
app = Flask(__name__)# 在使用表单前,需要初始化 SECRET_KEY
app.config['SECRET_KEY'] = 'SheepHero' # 自定义
# 可以通过GET和POST两种方式获取表单数据
@app.route('/form', methods=['GET', 'POST'])
def form():# args用户获取GET方式提交的数据msg_get = request.args.get('msg_get')# form用户获取POST方式提交的数据msg_post = request.form.get('msg_post')return f'GET数据:{msg_get} <br/> POST数据:{msg_post}'if __name__=='__main__':# 运行Flask应用,监听默认端口5000app.run(debug=True, host='0.0.0.0')
GET请求
测试GET请求,浏览器输入http://172.16.37.37:5000/form?msg_get=你好!即可

POST请求
测试POST请求,可以编写一个Python脚本,模拟POST请求
# 保存为post.py文件
import requests
url = 'http://172.16.37.37:5000/form'
payload = {'name':'羊大侠','alias':'SheepHero','msg_post':'Py羊大侠'
}
response = requests.post(url, data=payload)
print(response)
print(response.text)

相关文章:
【SH】在Ubuntu Server 24中基于Python Web应用的Flask Web开发(实现POST请求)学习笔记
文章目录 Flask开发环境搭建保持Flask运行Debug调试 路由和视图可变路由 请求和响应获取请求信息Request属性响应状态码常见状态码CookieSession 表单GET请求POST请求 Flask 在用户使用浏览器访问网页的过程中,浏览器首先会发送一个请求到服务器,服务器…...
一些经济政治学类书籍推荐 --- 以及与之相关我的经历和理解
我给所开设的兴趣专栏_墨#≯的博客-CSDN博客,的介绍是: 聊聊关于文学、经济(股票等)、法律方面的个人感受与理解。 不过目前已有的两篇以及现在在写的这篇都是经济相关的,其实专栏开设的9月至今,我也看了好几本文学相关的书&#…...
设计模式之 abstract factory
适用场景 一个系统要独立于它的产品的创建、组合和表示时。一个系统要由多个产品系列中的一个来配置时。当你要强调一系列相关的产品对象的设计以便进行联合使用时。当你提供一个产品类库,而只想显示它们的接口而不是实现时 架构演示 首先client这个东西可以接触到…...
汽车IVI中控开发入门及进阶(三十八):手机投屏HiCar开发
手机投屏轻松实现手机与汽车的无缝连接,导航、音乐、通话等功能应有尽有,还支持更多第三方应用,让车载互联生活更加丰富多彩。 HiCar在兼容性和开放性上更具优势。 手机投屏可以说是车机的杀手级应用,大大拓宽了车机的可用性范围。其中华为推出的HiCar就是非常好用的一种。…...
Springmvc,spring ,mybatis,整合,ssm
上一章内容: 1.spring框架:作用 开源的框架--提供IOC和AOPIOC控制反转 把创建对象的权力交于spring创建,并管理对象的生命周期,通过DI完成对象属性的注入。 2. spring配置中<bean>也可以使用注解Component Controller Service Repo…...
《庐山派从入门到...》板载按键启动!
《庐山派从入门到...》板载按键启动! 《庐山派从入门到...》板载按键启动! 视频内容大致如下 我们之前了解了GPIO的输出模式使用方法,并且成功点灯,很明显本篇要来分享的自然是GPIO的输入模式 正好回顾一下之前学的python基础包…...
Mapbox-GL 中 `token` 的使用
Mapbox-GL 是一个开源的 JavaScript 库,允许开发者在网页上渲染交互式地图。token 在 Mapbox 中主要是指 access token,它用于身份验证和授权,确保应用程序能够访问 Mapbox 的地图服务。 下面详细解析 Mapbox GL 中 token 的使用,…...
Flutter组件————PageView
PageView 可以创建滑动页面效果的widget,它允许用户通过水平或垂直滑动手势在多个子页面(child widgets)之间切换。每个子页面通常占据屏幕的全部空间。 参数 参数名类型描述childrenList<Widget>包含在 PageView 中的所有子部件&am…...
c#自定义事件
自定义事件类 定义一个自定义事件参数类 为了传递更多的信息,我们定义一个自定义的事件参数类 public class CustomEventArgs : EventArgs {public string Message { get; set; } } 3. 定义一个发布者类 接下来,我们定义一个发布者类,包含…...
【读书笔记】《论语别裁》寂寞的享受
1.内容摘要 在《论语别裁》中,第一章《学而》探讨了做学问的孤独与坚持。作者强调,真正的学者在追求知识时,必须保持“仁”与“义”的核心价值观,愿意为自己的信念与理想而牺牲。他以孔子为例,描绘了孔子一生的寂寞与…...
Oracle筑基篇-调度算法-LRU的引入
常见的调度算法 图1 调度算法思维导图 一、LRU算法的典型使用场景 1. 操作系统中的页面置换 什么时候用到页面置换算法呢? 当CPU发出指令需要访问某个地址时,若该地址在TLB(Translation Lookaside Buffer,快表)或页…...
单元测试-Unittest框架实践
文章目录 1.Unittest简介1.1 自动化测试用例编写步骤1.2 相关概念1.3 用例编写规则1.4 断言方法 2.示例2.1 业务代码2.2 编写测试用例2.3 生成报告2.3.1 方法12.3.2 方法2 1.Unittest简介 Unittest是Python自带的单元测试框架,适用于:单元测试、Web自动…...
linux驱动:6ull(3)自动分配设备号来创建led驱动
在 linux驱动:6ull(2)的文章代码上进行更改 步骤: 创建入口函数和出口函数定义一个设备结构体和创建一个led设备在入口函数init中添加初始化led的gpio在入口函数init中添加自动分配设备号来创建led字符设备在出口函数中取消led的…...
GM_T 0039《密码模块安全检测要求》题目
单项选择题 根据GM/T 0039《密码模块安全检测要求》,送检单位的密码模块应包括()密码主管角色。 A.一个 B.两个 C.至少一个 D.至少两个 正确答案:C 多项选择题 根据GM/T 0039《密码模块安全检测要求》,关于非入侵式安全,以下属于安全三级密码模块要求的是()。 …...
第四届电气工程与控制科学
重要信息 官网:www.ic2ecs.com 时间:2024年12月27-29日 简介 第四届电气工程与控制科学定于2024年12月27-29日在中国南京召开。主要围绕“电气工程“、”控制科学“、”机械工程“、”自动化”等主题展开,旨在为从电…...
LabVIEW在电液比例控制与伺服控制中的应用
LabVIEW作为一种图形化编程环境,广泛应用于各类控制系统中,包括电液比例控制和伺服控制领域。在这些高精度、高动态要求的控制系统中,LabVIEW的优势尤为突出。以下从多个角度探讨其应用与优势: 1. 灵活的控制架构 LabVIEW为电…...
植物大战僵尸杂交版v3.0.2最新版本(附下载链接)
B站游戏作者潜艇伟伟迷于12月21日更新了植物大战僵尸杂交版3.0.2版本!!!,有b站账户的记得要给作者三连关注一下呀! 不多废话下载链接放上: 夸克网盘链接::https://pan.quark.cn/s/5c…...
车辆重识别代码笔记12.19
1、resnet_ibn_a和resnet网络的区别 ResNet-IBN-A 是在 ResNet 基础上进行了一些改进的变种,具体来说,它引入了 Instance Batch Normalization (IBN) 的概念,这在某些任务中(如图像识别、迁移学习等)有显著的性能提升。…...
linux内核网络分层概述
在开发应用时,我们使用 socket 实现网络数据的收发。以tcp为例,server端通过 socket, bind, listen来创建服务端,然后通过 accept接收客户端连接;客户端通过 socket和 connect系统调用来创建客户端。用于数据收发的系统调用包括 s…...
H3C交换机配置 telnet 服务
使用一个交换机做成 telnet 服务, telnet 可以使用指定端口开启三层交换机, 用于与 pc 互通, 也可以使用自带的 vlan1 设置 ip 然后达到互通, 因为华三的交换机端口默认是 access 口, 默认带 vlan1 , 直接设置 vlan1 的 ip 也就可以实现互通 实现互通 互通的两种方式 设置 vl…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
