flask框架制作前端网页作为GUI

一、语法和原理

(一)、文件目录结构

需要注意的问题:启动文件命名必须是app.py。

一个典型的Flask应用通常包含以下几个基本文件和文件夹:

app.py:应用的入口文件,包含了应用的初始化和配置。
requirements.txt:应用所依赖的Python包列表。可以使用该文件来管理应用的依赖关系。
README.md:应用的说明文档,包含了应用的运行方法、配置说明等。
venv/:虚拟环境文件夹,用于隔离应用的Python环境。
除了上述基本文件和文件夹外,应用的根目录还可以包含其他一些文件,例如:

static/:静态文件目录,用于存放应用所需的静态资源,如CSS样式表、JavaScript文件、图片等。
templates/:模板文件目录,用于存放应用的HTML模板文件。Flask使用Jinja2作为模板引擎,可以通过模板文件生成动态的HTML页面。

app/
├── __init__.py
├── routes.py
├── models.py
├── forms.py
├── helpers.py
├── static/
│   ├── css/
│   ├── js/
│   └── images/
└── templates/└── base.html└── index.html└── ...

二、案例

(一)、目录结构如下:

在这里插入图片描述

(二)、功能与代码

读取文件到app文件夹下并将文件名写入对应的txt文件(现代浏览器不允许获取本地路径),后续通过读入txt的文件名来拼接路径,读取app文件夹下的文件。

步骤:

1、创建主页面

创建一个名为templates的目录,并在其中创建一个名为index.html的文件。将以下HTML代码粘贴到该文件中:

将url_for()函数指向的URL临时替换为了#。在实际项目中,请根据你的路由配置重新添加对应的URL路径。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><!-- 添加CSS样式 --><style>/* 定义一个包含链接的容器,使其居中并分散布局 */.link-container {display: flex;justify-content: space-between; /* 使链接在容器内水平分散 */align-items: center; /* 使链接垂直居中 */width: 100%;max-width: 600px; /* 设置最大宽度以适应不同屏幕尺寸 */margin: 0 auto; /* 在页面中央对齐容器 */padding: 20px 0; /* 上下增加间距 */}/* 定义链接的基本样式 */.link-item {padding: 10px 15px; /* 内边距,提供点击区域 */border-radius: 4px; /* 圆角效果 */text-decoration: none; /* 去除默认下划线 */color: white; /* 文字颜色 */font-weight: bold; /* 加粗字体 */transition: background-color 0.3s ease; /* 添加平滑背景色过渡效果 */}/* 分别为三个链接设置不同的背景颜色 */.link-item.load-model {background-color: #e74c3c; /* 红色 */}.link-item.input-action {background-color: #2ecc71; /* 绿色 */}.link-item.output-action {background-color: #3498db; /* 蓝色 */}</style><title>App Title</title>
</head>
<body><!-- 创建一个包含三个链接的 Flexbox 容器 --><div class="link-container"><!-- 第一个链接,指向 'load_model' 页面 --><a href="#" class="link-item load-model">加载模型</a><!-- 第二个链接,指向 'input' 页面 --><a href="#" class="link-item input-action">输入</a><!-- 第三个链接,指向 'output' 页面 --><a href="#" class="link-item output-action">输出</a></div><!-- Jinja2 模板中的内容块(已移除 Flask 相关内容) --><!-- {% block content %}{% endblock %} -->
</body>
</html>
2、创建二级页面

在二级页面中实现文件的上传功能。

在templates目录中创建三个子目录:load_model, input, 和 output。
在每个子目录中创建一个名为form.html的文件,并将以下HTML代码粘贴到每个文件中:

<form method="post" enctype="multipart/form-data"><input type="file" name="file"><button type="submit">提交</button>
</form>
3、后端处理

通过Python路由函数实现数据的读取和文件名写入txt

更新的app.py以处理这些表单。将以下python代码添加到app.py文件中:

from flask import Flask, render_template, request
import osapp = Flask(__name__)
model_file = 'model_name.txt'
input_file = 'input.txt'
output_file = 'output.txt'@app.route('/')
def index():return render_template('index.html')@app.route('/load_model', methods=['GET', 'POST'])
def load_model():if request.method == 'POST':file = request.files['file']if file:filename = file.filenamefile.save(os.path.join(app.root_path, filename))print(f"模型已加载:{filename}")# 名称写入txt文档with open(model_file, 'w') as f:f.write(filename)return render_template('load_model/form.html')@app.route('/input', methods=['GET', 'POST'])
def input():if request.method == 'POST':file = request.files['file']if file:filename = file.filenamefile.save(os.path.join(app.root_path, 'input'))print(f"输入文件已上传:{filename}")# 名称写入txt文档with open(model_file, 'w') as f:f.write(filename)return render_template('input/form.html')@app.route('/output', methods=['GET', 'POST'])
def output():if request.method == 'POST':file = request.files['file']if file:filename = file.filenamefile.save(os.path.join(app.root_path, 'output'))print(f"输出文件已上传:{filename}")return render_template('output/form.html')if __name__ == '__main__':app.run(debug=True)

运行python app.py时,应用程序将在http://localhost:5000上启动。您将看到一个包含三个按钮的页面,每个按钮都链接到一个表单,用于上传本地文件。点击每个按钮将打开一个新的页面,其中包含一个文件上传表单。提交表单后,文件将被保存到相应的目录中。

steamlit
需求

在上面的基础上做如下修改,1、上传按钮只留下一个,并取消上传文件大小限制。2、上传文件到E:\web_steamlit文件夹。3、输出部分为使用pandas 读取E:\web_steamlit文件夹下的 地址表.xlsx并在页面展示前10行,4、输出部分需要给出一个按钮让用户能从E:\web_steamlit下的 地址表.xlsx到用户指定位置

在generate_output()函数中,你尝试下载df变量,但df是一个Pandas DataFrame对象,不能直接下载。你需要将其转换为二进制数据,然后使用st.download_button()函数。你可以使用DataFrame.to_csv()方法将DataFrame转换为CSV文件,然后将其写入内存中。例如,你可以这样修改:

import os
import io
import pandas as pd
import streamlit as st
import streamlit.components.v1 as components

st.set_page_config(page_title=“智能平台”, page_icon=None, layout=“centered”, initial_sidebar_state=“auto”, menu_items=None)

设置主题

st.markdown(
f"“”

“”",
unsafe_allow_html=True
)

st.markdown(“”"

pass

“”",unsafe_allow_html=True)

输入部分

def get_input(up_folder_path):
# 创建一个上传文件组件
file = st.file_uploader(“输入文件”)
# 检查是否上传了文件
if file is not None:
# 将文件保存到指定目录
file_path = up_folder_path+file.name
with open(file_path, ‘wb’) as f:
f.write(file.getvalue())

return file

输出部分

def generate_output(file_path):
# 读取文件
df = pd.read_excel(file_path)
st.dataframe(df.head(10))

# 创建一个下载按钮
csv_buffer = io.StringIO()
df.to_csv(csv_buffer, index=False)# 将CSV文件内容转换为二进制数据
csv_data = csv_buffer.getvalue().encode("utf-8")# 下载文件
st.download_button("下载文件",csv_data,"result.csv","text/csv"
)

主体部分

##https://www.zhihu.com/question/483788619/answer/3292315479 搜索 我们的Streamlit交流群中经常听到小伙伴们吐槽Streamlit自带的表格样式太不友好了
def draw_table(df, theme, table_height):
columns = df.columns
thead1=“”“”“”
thead_temp = []
for k in range(len(list(columns))):
thead_temp.append(“”“”“”+str(list(columns)[k])+“”“”“”)
header = thead1+“”.join(thead_temp)+“”“”“”
rows = []
rows_temp = []
for i in range(df.shape[0]):
rows.append(“”“”“”+str(i+1)+“”“”“”)
rows_temp.append(df.iloc[i].values.tolist())
td_temp = []
for j in range(len(rows_temp)):
for m in range(len(rows_temp[j])):
td_temp.append(“”“”“”+str(rows_temp[j][m])+“”“”“”)
td_temp2 = []
for n in range(len(td_temp)):
td_temp2.append(td_temp[n:n+df.shape[1]])
td_temp3 = []
for x in range(len(td_temp2)):
if int(x % (df.shape[1])) == 0:
td_temp3.append(td_temp2[x])
td_temp4 = []
for xx in range(len(td_temp3)):
td_temp4.append(“”.join(td_temp3[xx]))
td_temp5 = []
for v in range(len(td_temp4)):
td_temp5.append(“”“”“”+str(v+1)+“”“”“”+str(td_temp4[v])+“”“”“”)
table_html = “”“”“”+
“”“”“”+
“”“<table class=“table text-center table-bordered “””+str(theme)+'”'+“>”“” +
header+“”“”“”+“”.join(td_temp5)+“”“”“”

return components.html(table_html,height=table_height, scrolling=True)

输出部分

def table_output(file_path):
# 读取文件
df = pd.read_excel(file_path)
theme_list=[“bg-primary”, “bg-success”, “bg-warning”, “bg-danger”, “bg-info”, “table-dark”]
theme = st.selectbox(“请选择一种主题”, theme_list)
draw_table(df, theme=theme, table_height=300)
# 显示前10行
st.dataframe(df.head(10))

def main():
#网页模型
st.title(“智能平台”)

# 加载模型# 获取用户输入
input_data = get_input(up_folder_path)# 生成输出
generate_output(file_path)#table_output(file_path)

if name == “main”:
file_path=r"E:\web_steamlit\地址表.xlsx"
up_folder_path=r"E:\web_steamlit\"
main()

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

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

相关文章

【DeepLearning-8】MobileViT模块配置

完整代码&#xff1a; import torch import torch.nn as nn from einops import rearrange def conv_1x1_bn(inp, oup):return nn.Sequential(nn.Conv2d(inp, oup, 1, 1, 0, biasFalse),nn.BatchNorm2d(oup),nn.SiLU()) def conv_nxn_bn(inp, oup, kernal_size3, stride1):re…

Java基础知识-异常

资料来自黑马程序员 异常 异常&#xff0c;就是不正常的意思。在生活中:医生说,你的身体某个部位有异常,该部位和正常相比有点不同,该部位的功能将受影响.在程序中的意思就是&#xff1a; 异常 &#xff1a;指的是程序在执行过程中&#xff0c;出现的非正常的情况&#xff0c;…

深入理解HarmonyOS UIAbility:生命周期、WindowStage与启动模式探析

UIAbility组件概述 UIAbility组件是HarmonyOS中一种包含UI界面的应用组件&#xff0c;主要用于与用户进行交互。每个UIAbility组件实例对应最近任务列表中的一个任务&#xff0c;可以包含多个页面来实现不同功能模块。 声明配置 为了使用UIAbility&#xff0c;首先需要在mod…

跟着cherno手搓游戏引擎【10】使用glm窗口特性

修改ImGui层架构&#xff1a; 创建&#xff1a; ImGuiBuild.cpp&#xff1a;引入ImGui #include"ytpch.h" #define IMGUI_IMPL_OPENGL_LOADER_GLAD//opengl的头文件需要的定义&#xff0c;说明使用的是gald #include "backends/imgui_impl_opengl3.cpp" …

03_Opencv简单实例演示效果和基本介绍

视频处理 视频分解图片 在后面我们要学习的机器学习中,我们需要大量的图片训练样本,这些图片训练样本如果我们全都使用相机拍照的方式去获取的话,工作量会非常巨大, 通常的做法是我们通过录制视频,然后提取视频中的每一帧即可! 接下来,我们就来学习如何从视频中获取信息 ubun…

c#之构值类型和引用类型

值类型:(整数/bool/struct/char/小数) 引用类型:(string/ 数组 / 自定义的类 / 内置的类) 值类型只需要一段单独的内存,用于存储实际的数据 引用类型需要两段内存(第一段存储实际的数据,他总是位于 堆中第二段是一个引用,指向数据在堆中的存放位置) 当使用引用类型赋值的时…

C++:类 的简单介绍(一)

目录 类的引用&#xff1a; 类的定义&#xff1a; 类的两种定义方式&#xff1a; 成员变量命名规则的建议&#xff1a; 类的访问限定符及封装&#xff1a; 访问限定符 【访问限定符说明】 封装 class与struct的区别&#xff1a; 类的作用域&#xff1a; 类的实例化…

嵌入式——直接存储器存取(DMA)补充

目录 一、认识 DMA 二、DMA结构 1. DMA请求 2. 通道DMA 补&#xff1a;通道配置过程。 3. 仲裁器 三、DMA数据配置 1. 从哪里来&#xff0c;到哪里去 &#xff08;1&#xff09;从外设到存储器 &#xff08;2&#xff09;从存储器到外设 &#xff08;3&#xff09;从…

React 组件生命周期-概述、生命周期钩子函数 - 挂载时、生命周期钩子函数 - 更新时、生命周期钩子函数 - 卸载时

React 组件生命周期-概述 学习目标&#xff1a; 能够说出组件的生命周期一共几个阶段 组件的生命周期是指组件从被创建到挂在到页面中运行&#xff0c;在到组件不用时卸载组件 注意&#xff1a;只有类组件才有生命周期&#xff0c;函数组件没有生命周期(类组件需要实例化&…

LeetCode344反转字符串(java实现)

今天我们来分享的题目是leetcode344反转字符串。题目描述如下&#xff1a; 我们观察题目发现&#xff0c;题目要求使用O(1)的空间解决这一问题。那么我们就不能进行使用开辟新的数组进行反转了。 解题思路&#xff1a;那么该题的我得思路是使用双指针的方法进行题解&#xff0…

2024獬豸杯

2024.1.28上午9-12时&#xff0c;返乡大学生边帮姐带娃边做&#xff0c;有几题没交上 解压密码&#xff1a;都考100分 手机备份包 手机基本信息 1、IOS手机备份包是什么时候开始备份的。&#xff08;标准格式&#xff1a;2024-01-20.12:12:12) 2024-01-15.14.19.44 2、请分…

Docker 安装与基本操作

目录 一、Docker 概述 1、Docker 简述 2、Docker 的优势 3、Docker与虚拟机的区别 4、Docker 的核心概念 1&#xff09;镜像 2&#xff09;容器 3&#xff09;仓库 二、Docker 安装 1、命令&#xff1a; 2、实操&#xff1a; 三、Docker 镜像操作 1、命令&#xff1…

centos7 挂载windows共享文件夹报错提示写保护

centos7挂载windows共享时&#xff0c;提示被共享的位置写保护&#xff0c;只能以只读方式挂载&#xff0c;紧接着就是以只读方式挂载失败 原因是组件少装了 yum install cifs-utils 安装完后&#xff0c;正常挂载使用。 下载离线安装包 下载离线包下载工具 下载离线安装包…

SpringBoot系列之MybatisPlus实现分组查询

SpringBoot系列之MybatisPlus实现分组查询 我之前博主曾记写过一篇介绍SpringBoot2.0项目怎么集成MybatisPlus的教程&#xff0c;不过之前的博客只是介绍了怎么集成&#xff0c;并没有做详细的描述各种业务场景&#xff0c;本篇博客是对之前博客的补充&#xff0c;介绍在mybat…

2024/1/27 备战蓝桥杯 1-1

目录 求和 0求和 - 蓝桥云课 (lanqiao.cn) 成绩分析 0成绩分析 - 蓝桥云课 (lanqiao.cn) 合法日期 0合法日期 - 蓝桥云课 (lanqiao.cn) 时间加法 0时间加法 - 蓝桥云课 (lanqiao.cn) 扫雷 0扫雷 - 蓝桥云课 (lanqiao.cn) 大写 0大写 - 蓝桥云课 (lanqiao.cn) 标题…

【SpringSpringBoot】概述

Spring&SpringBoot专题 【注】&#xff1a; 本专题围绕框架核心概念展开&#xff0c;渐进式深入总结学习、面试、开发经验&#xff0c;集中整理便于回顾 持续补充与施工中~~~~ 1.发展史 2.基本架构 Spring框架的基本架构是一个分层架构&#xff0c;包括多个模块&#x…

2024三掌柜赠书活动第六期:人人都离不开的算法——图解算法应用

目录 前言算法概念图解算法应用算法的价值和挑战关于《人人都离不开的算法——图解算法应用》编辑推荐内容简介作者简介图书目录书中前言/序言书摘插画《人人都离不开的算法——图解算法应用》全书速览结束语 前言 作为开发者想必都知道&#xff0c;算法是现代社会中无处不在…

day33_js

今日内容 0 复习昨日 1 JS概述 2 JS的引入方式 3 JS语法 3.1 变量 3.2 基本数据类型 3.3 引用类型 3.4 数组类型 3.5 日期类型 3.6 运算符(算术运算,逻辑,关系运算,三目运算) 3.7 分支 3.8 循环 3.9 函数(重点) 3 常见弹窗函数 alter,confirm,prompt 0 复习昨日 1 盒子模型 对d…

兄弟MFC-8515DN黑白激光多功能一体机硒鼓及粉盒清零方法

耗材信息&#xff1a; 硒鼓DR-3350&#xff1a;约30000页&#xff1b; 墨粉盒TN-3335&#xff1a;约3000页【A4纸5%覆盖率】&#xff1b; 高容量墨粉盒TN-3385&#xff1a;约8000页【A4纸5%覆盖率】&#xff1b; 超高容量墨粉盒TN-3395&#xff1a;约12000页【A4纸5%覆盖率】&a…

php项目下微信小程序对接实战问题与解决方案

一.实战问题与方案总结 1.SQL查询条件是一组数&#xff0c;传参却是一个字符串导致报错&#xff0c;如下 SQLSTATE[HY093]: Invalid parameter number (SQL: select count(*) as aggregate from car_video where province_id in (1492) and city_id in (1493) and county_id …