您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Python PyWebIO怎么实现网页版数据查询器
## 前言
在数据驱动的时代,快速查询和分析数据是许多业务场景的刚需。传统的数据查询工具往往需要复杂的安装配置或专业的技术背景,而基于Web的轻量级解决方案正变得越来越受欢迎。本文将介绍如何使用Python的PyWebIO库快速构建一个网页版数据查询器,无需前端开发经验即可实现交互式数据查询界面。
## 一、PyWebIO简介
### 1.1 什么是PyWebIO
PyWebIO是一个允许开发者用纯Python快速构建Web应用的库,具有以下特点:
- 无需HTML/JS/CSS知识
- 支持丰富的输入输出组件
- 同步编程模型(也支持协程)
- 可集成到现有Web框架
### 1.2 核心功能
| 功能类别 | 示例组件 |
|----------------|--------------------------|
| 输入组件 | 输入框、下拉框、文件上传 |
| 输出组件 | 表格、图表、Markdown |
| 布局组件 | 分栏、折叠面板、选项卡 |
| 回调处理 | 按钮点击、表单提交 |
## 二、环境准备
### 2.1 安装PyWebIO
```bash
pip install pywebio
pip install pandas matplotlib # 数据处理和可视化
from pywebio import start_server
from pywebio.input import *
from pywebio.output import *
def search_app():
put_markdown("## 简易数据查询器")
info = input_group("查询参数", [
input("请输入关键词", name="keyword"),
select("选择分类", options=['A类', 'B类', 'C类'], name="category")
])
# 模拟数据查询
data = [
{"id": 1, "name": "示例数据1", "value": 100},
{"id": 2, "name": "示例数据2", "value": 200}
]
put_table(data, header=['ID', '名称', '数值'])
if __name__ == '__main__':
start_server(search_app, port=8080)
input_group
组合多个输入项put_table
展示表格数据import sqlite3
def query_db(keyword):
conn = sqlite3.connect('example.db')
cursor = conn.cursor()
cursor.execute("SELECT * FROM data WHERE name LIKE ?", (f'%{keyword}%',))
return cursor.fetchall()
from pywebio.pin import put_select, pin_wait_change
def pagination(data, page_size=10):
total = len(data)
pages = (total - 1) // page_size + 1
put_select('page', options=list(range(1, pages+1)),
while True:
page = pin_wait_change('page')['value']
start = (page-1)*page_size
put_table(data[start:start+page_size])
import matplotlib.pyplot as plt
import io
def show_chart(data):
fig, ax = plt.subplots()
ax.bar([x[0] for x in data], [x[1] for x in data])
buf = io.BytesIO()
plt.savefig(buf, format='png')
put_image(buf.getvalue())
from pywebio import start_server
from pywebio.input import *
from pywebio.output import *
from pywebio.pin import *
from pywebio.session import *
import pandas as pd
import numpy as np
# 模拟数据集
def generate_sample_data():
np.random.seed(42)
dates = pd.date_range('2023-01-01', '2023-12-31')
return pd.DataFrame({
'date': np.random.choice(dates, 1000),
'product': np.random.choice(['手机', '电脑', '平板', '配件'], 1000),
'category': np.random.choice(['电子', '办公', '配件'], 1000),
'sales': np.random.randint(1, 100, 1000),
'revenue': np.random.uniform(10, 1000, 1000).round(2)
})
df = generate_sample_data()
def main():
put_markdown("# 电商数据查询系统")
# 查询条件区域
with use_scope('condition'):
info = input_group("查询条件", [
input("开始日期", type=DATE, name='start_date'),
input("结束日期", type=DATE, name='end_date'),
select("产品类型", options=['全部']+list(df['product'].unique()), name='product'),
select("排序方式", options=['销量降序', '销售额降序'], name='sort')
])
# 数据处理
mask = (df['date'] >= info['start_date']) & (df['date'] <= info['end_date'])
if info['product'] != '全部':
mask &= (df['product'] == info['product'])
result = df[mask].copy()
if info['sort'] == '销量降序':
result = result.sort_values('sales', ascending=False)
else:
result = result.sort_values('revenue', ascending=False)
# 结果展示
with use_scope('result'):
put_markdown(f"### 查询结果(共{len(result)}条记录)")
# 数据摘要
put_row([
put_info(f"总销量: {result['sales'].sum()}"),
put_success(f"总销售额: {result['revenue'].sum():.2f}"),
put_warning(f"平均单价: {(result['revenue'].sum()/result['sales'].sum()):.2f}")
], size='1fr 1fr 1fr')
# 分页显示
PAGE_SIZE = 15
total_pages = (len(result) - 1) // PAGE_SIZE + 1
put_select('page', label='选择页码', options=[
{'label': f'第{i+1}页', 'value': i}
for i in range(total_pages)
])
while True:
page_idx = pin.pin.page
start = page_idx * PAGE_SIZE
page_data = result.iloc[start: start+PAGE_SIZE]
clear(scope='page_content')
with use_scope('page_content'):
put_table(page_data.to_dict('records'),
header=list(result.columns))
# 添加导出按钮
if put_button("导出当前页数据", onclick=lambda:
put_file('current_page.csv',
page_data.to_csv(index=False).encode())):
pass
pin_wait_change('page')
if __name__ == '__main__':
start_server(main, port=8080, debug=True)
python app.py
from pywebio.platform.tornado import start_server
start_server(main, port=80, host='0.0.0.0')
from pywebio.platform.flask import webio_view
from flask import Flask
app = Flask(__name__)
app.add_url_rule('/tool', 'webio_view', webio_view(main))
通过PyWebIO,我们仅用Python就实现了一个功能完整的网页版数据查询器。相比传统Web开发,这种方式具有以下优势:
虽然PyWebIO不适合复杂前端交互的场景,但对于大多数数据查询和展示需求,它提供了一个极其高效的解决方案。读者可以基于本文示例,继续扩展更复杂的业务功能。 “`
这篇技术文章包含了约2650字,采用Markdown格式编写,主要内容包括: 1. PyWebIO基础介绍 2. 实现步骤详解 3. 完整案例代码 4. 部署和优化建议 5. 实用技巧和注意事项
文章结构清晰,包含代码示例、表格和列表等多种内容表现形式,适合技术博客发布。需要调整细节或补充特定内容可以进一步修改。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。