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

news2025/1/12 23:42:45

一、语法和原理

(一)、文件目录结构

需要注意的问题:启动文件命名必须是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 os

app = 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.filename
            file.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.filename
            file.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.filename
            file.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.coloradmin.cn/o/1417370.html

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

相关文章

【漏洞复现】中移铁通禹路由器弱口令漏洞

Nx01 产品简介 中移禹路由器支持宽带拨号、动态IP和静态IP三种上网模式,一般中国移动宽带的光猫都是智能光猫也就是光猫带路由器功能,中移禹路由器作为二级路由使用。 Nx02 漏洞描述 中移禹路由器存在默认口令(admin)&#xff0c;攻击者可利用该漏洞获取敏感信息。 Nx03 产品…

用Python编写的简单双人对战五子棋游戏

本文是使用python创建的一个基于tkinter库的GUI界面&#xff0c;用于实现五子棋游戏。编辑器使用的是spyder&#xff0c;该工具。既方便做数据分析&#xff0c;又可以做小工具开发&#xff0c; 首先&#xff0c;导入tkinter库&#xff1a;import tkinter as tk&#xff0c;这…

Qt无边框窗口拖拽和阴影

先看下效果&#xff1a; 说明 自定义窗口控件的无边框,窗口事件由于没有系统自带边框,无法实现拖拽拉伸等事件的处理,一种方法就是重新重写主窗口的鼠标事件&#xff0c;一种时通过nativeEvent事件处理。重写事件相对繁琐,我们这里推荐nativeEvent处理。注意后续我们在做win平…

HarmonyOS4.0系统性深入开发29层叠布局

层叠布局&#xff08;Stack&#xff09; 概述 层叠布局&#xff08;StackLayout&#xff09;用于在屏幕上预留一块区域来显示组件中的元素&#xff0c;提供元素可以重叠的布局。层叠布局通过Stack容器组件实现位置的固定定位与层叠&#xff0c;容器中的子元素&#xff08;子组…

maven中的version加不加SNAPSHOT的区别

我们平时开发时经常看到maven的pom.xml文件里面的包有两种 因为maven的远程仓库一般分为public(Release)和SNAPSHOT&#xff0c;前者代表正式版本&#xff0c;后者代表快照版本。 具体有什么区别呢&#xff1a; 举例说明&#xff0c;你开发了一个基础功能&#xff0c;打包发布…

bxCAN 主要特性

bxCAN 主要特性 ● 支持 2.0 A 及 2.0 B Active 版本 CAN 协议 ● 比特率高达 1 Mb/s ● 支持时间触发通信方案 发送 ● 三个发送邮箱 ● 可配置的发送优先级 ● SOF 发送时间戳 接收 ● 两个具有三级深度的接收 FIFO ● 可调整的筛选器组&#xff1a; — CAN1 和…

Execution failed for task ‘:app:compileFlutterBuildDebug‘. 解决

前言 项目场景&#xff1a;在Flutter项目中 或 在嵌入Flutter模块的Android原生项目&#xff1b; 启动场景&#xff1a;在Android原生端 编译 或 运行 项目时&#xff0c;可能出现这个异常&#xff1b; 异常 Build窗口并没有追踪到&#xff0c;引发异常代码位置&#xff0c;…

微信小程序Skyline在手机端不渲染的问题之一及其解决方式

问题&#xff1a;电脑端是skyline渲染&#xff0c;手机端是webview渲染?如何解? 开发者工具 当前渲染模式&#xff1a;Skyline 当进行预览时手机端却是: 请注意看轮播图的显示情况 请注意看轮播图的显示情况 请注意看轮播图的显示情况 从轮播图上来看,手机端是webview渲染…

[设计模式Java实现附plantuml源码~结构型]树形结构的处理——组合模式

前言&#xff1a; 为什么之前写过Golang 版的设计模式&#xff0c;还在重新写Java 版&#xff1f; 答&#xff1a;因为对于我而言&#xff0c;当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言&#xff0c;更适合用于学习设计模式。 为什么类图要附上uml 因为很…

聊聊Git合并和变基

一、 Git Merge 合并策略 1.1 Fast-Forward Merge&#xff08;快进式合并&#xff09; //在分支1下操作&#xff0c;会将分支1合并到分支2中 git merge <分支2>最简单的合并算法&#xff0c;它是在一条不分叉的两个分支之间进行合并。快进式合并是默认的合并行为&#…

【BUG】联想Y7000电池电量为0且无法充电解决方案汇总

因为最近火灾很多&#xff0c;所以昨天夜晚睡觉的时候把插线板电源关掉了&#xff0c;电脑也关机了。 各位一定要注意用电安全&#xff0c;网上的那些事情看着真的很难受qvq。 第二天早上起床的时候一看发现电脑直接没电了&#xff0c;插上电源后也是显示 你一定要冲进去啊(ू˃…

TypeScript(三) 声明变量

1.声明变量 1.1. typescript变量声明 变量是一种使用方便的占位符&#xff0c;用于引用计算机内存地址。   我们可以把变量看做存储数据的容器。   typescript变量的命名规则&#xff1a; &#xff08;1&#xff09;变量名称可以包含数字和字母。 &#xff08;2&#xff0…

flask初体验

1、定义 Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务。 中文官网 2、初步上手 1、安装flask pip3 install flask 2、创建flask应用 # -*- coding = utf-8 -*- # @Time : 2024/1/28 23:02 # @Author: Frank # @File: main.py…

unity36——原神等手游常用的物理bone(弹簧)裙摆,与Cloth(布料)裙摆插件 Magica Cloth 使用教程(一)

目前我们手游开发&#xff0c;经常会遇到头发&#xff0c;双马尾&#xff0c;长裙&#xff0c;飘带等。以前我们都是在三维软件中制作骨骼后&#xff0c;自己手动K针。这样做有一些弊端&#xff0c;时间长&#xff0c;并且K帧的飘带效果没法随着游戏中角色的移动&#xff0c;旋…

HarmonyOS鸿蒙ArkTS,封装http网络请求

HarmonyOS鸿蒙ArkTS&#xff0c;封装http网络请求 前提&#xff1a; 要想使用http请求&#xff0c;系统必须要具备ohos.permission.INTERNET权限&#xff0c;在model.json5文件中的module模块下添加如下请求权限&#xff1a; 在module.json5文件中 配置 "requestPermi…

构建外卖跑腿系统:技术实现与架构设计

在当今数字化时代&#xff0c;外卖跑腿系统已成为人们生活中不可或缺的一部分。本文将探讨如何利用先进的技术和架构设计&#xff0c;开发一个高效、可靠的外卖跑腿系统。 1. 技术选型 在开发外卖跑腿系统之前&#xff0c;我们需要仔细选择适合的技术栈&#xff0c;以确保系…

HCIP复习课(三层架构)

1、ip配置 R1&#xff1a; R2&#xff1a; SW1&#xff1a; SW2: 2、vlanif配置&#xff1a; SW1&#xff1a; SW2&#xff1a; 3、ospf配置&#xff1a; R1&#xff1a; SW1&#xff1a; SW2&#xff1a; 4、vlan配置 SW1&#xff1a; SW2&#xff1a; SW3&#xff1a; SW…

在中国如何方便地使用GPT Plus?

一、背景 通过魔法&#xff0c;顺利登录ChatGPT&#xff0c;准备升级GPT Plus时&#xff0c;发现需要国外信用卡才能支付&#xff0c;这对大多数中国人来说是不方便的。在google搜索解决方案时&#xff0c;发现了WildCard平台&#xff0c;可以一键升级 GPT Plus (GPT-4)。将基…

【开源】基于JAVA+Vue+SpringBoot的康复中心管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 普通用户模块2.2 护工模块2.3 管理员模块 三、系统展示四、核心代码4.1 查询康复护理4.2 新增康复训练4.3 查询房间4.4 查询来访4.5 新增用药 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的康复中…

BGP同步规则

BGP同步规则&#xff1a;开启同步下&#xff0c;从IBGP收到一条路由不会传给任何EBGP邻居(实验效果IBGP邻居和EBGP邻居都不传)&#xff0c;除非从自身的IGP中也学到这条路由。目的是防止AS内部出现路由黑洞&#xff0c;向外部通告了一个本AS不可达的虚假的路由。 同步规则只影响…