
传统Web开发需要掌握HTML、CSS和JavaScript等多种技术,这对许多Python开发者来说是一大障碍。PyWebIO正是为解决这一痛点而生的库,它让无需前端经验能够使用纯Python快速构建交互式网页应用。
PyWebIO是一个基于Python的Web应用开发框架,它提供了一系列命令式的交互函数,将浏览器变成了一个“富文本终端”。开发者只需调用简单的输入输出函数,就能创建出完整的Web应用,无需编写任何前端代码。
PyWebIO采用同步阻塞式的编程模式,代码顺序执行,等待用户输入后再继续执行后续逻辑,与编写传统Python脚本的思维方式完全一致。支持多种Web框架集成,包括Flask、Django、FastAPI等,也可以独立运行。
安装PyWebIO非常简单,只需一条命令:
pip install -U pywebioPyWebIO要求Python版本不低于3.5.2,推荐使用3.8及以上版本以便更好地兼容异步特性。
通过一个BMI计算器示例,体验PyWebIO的开发流程:
from pywebio.input import input, FLOAT
from pywebio.output import put_text
from pywebio import start_server
def bmi():
# 获取用户输入
height = input("请输入您的身高(cm):", type=FLOAT)
weight = input("请输入您的体重(kg):", type=FLOAT)
# 计算BMI值
bmi_value = weight / (height/100) ** 2
# 根据BMI值判断体型
if bmi_value < 18.5:
category = "偏瘦"
elif bmi_value < 25:
category = "正常"
elif bmi_value < 30:
category = "偏胖"
else:
category = "肥胖"
# 输出结果
put_text(f"您的BMI值为:{bmi_value:.1f},体型属于:{category}")
if __name__ == '__main__':
start_server(bmi, port=8080)运行上述代码后,在浏览器中访问 http://localhost:8080 ,即可看到完整的BMI计算应用。这个简单的示例展示了PyWebIO的核心功能:获取用户输入和输出结果。

PyWebIO提供了丰富的输入组件,可以满足各种数据输入需求:
from pywebio.input import input, select, checkbox, radio, textarea, file_upload
from pywebio.output import put_text, put_table
def survey():
# 文本输入
name = input("请输入您的姓名:")
# 下拉选择
age_group = select("请选择年龄段:", options=['18岁以下', '18-30岁', '30-45岁', '45岁以上'])
# 复选框
hobbies = checkbox("请选择您的爱好:", options=['阅读', '运动', '旅游', '游戏', '音乐'])
# 单选框
education = radio("请选择最高学历:", options=['高中及以下', '大专', '本科', '硕士及以上'])
# 多行文本
comment = textarea("请输入您的意见或建议:", placeholder="请在此输入...")
# 文件上传
avatar = file_upload("请上传头像(可选):", accept="image/*")
# 显示结果
put_table([
['项目', '内容'],
['姓名', name],
['年龄段', age_group],
['爱好', ', '.join(hobbies)],
['学历', education],
['意见', comment],
['头像', avatar['filename'] if avatar else '未上传']
])
if __name__ == '__main__':
start_server(survey, port=8080)






PyWebIO支持多种输出方式,并能灵活布局:
from pywebio.output import *
from pywebio import start_server
def layout_demo():
# 文本输出
put_text("这是一段普通文本")
put_markdown("这是**Markdown**格式文本")
# 表格输出
put_table([
['商品', '价格', '库存'],
['苹果', '5.5元', '100kg'],
['香蕉', '7元', '50kg']
])
# 行列布局
put_row([
put_column([
put_text('左侧区域1'),
put_text('左侧区域2')
]),
put_column([
put_text('右侧区域1'),
put_text('右侧区域2')
])
])
# 弹出窗口
popup('弹出窗口', '这里是弹出窗口的内容')
if __name__ == '__main__':
start_server(layout_demo, port=8080)PyWebIO可以轻松集成主流的数据可视化库,如Matplotlib、Plotly等:
import matplotlib.pyplot as plt
import numpy as np
from pywebio.output import put_image, put_text
from pywebio import start_server
def visualization():
put_text("下面是一个简单的数据可视化示例:")
# 生成示例数据
x = np.linspace(0, 10, 100)
y = np.sin(x)
# 创建图表
plt.figure(figsize=(8, 4))
plt.plot(x, y, label='sin(x)')
plt.title('正弦函数图像')
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.legend()
plt.grid(True)
# 保存图表并显示
plt.savefig('sin_plot.png', dpi=100, bbox_inches='tight')
put_image(open('sin_plot.png', 'rb').read())
if __name__ == '__main__':
start_server(visualization, port=8080)PyWebIO可以轻松集成到现有的Flask、Django等Web项目中:
from flask import Flask
from pywebio.platform.flask import webio_view
from pywebio.input import input, TEXT
from pywebio.output import put_text
app = Flask(__name__)
def pywebio_app():
name = input("请输入您的姓名:", type=TEXT)
put_text(f"您好,{name}!欢迎使用PyWebIO!")
# 添加PyWebIO路由
app.add_url_rule('/tool', 'webio_tool', webio_view(pywebio_app), methods=['GET', 'POST'])
@app.route('/')
def index():
return '''<html>
<body>
<h1>我的Web应用</h1>
<a href="/tool">使用PyWebIO工具</a>
</body>
</html>'''
if __name__ == '__main__':
app.run(debug=True)开发一个实用的文件处理工具,支持文件上传、内容预览和简单处理:
from pywebio.input import file_upload, select
from pywebio.output import put_text, put_table, put_code, put_file
from pywebio import start_server
import pandas as pd
def file_processor():
# 文件上传
file = file_upload(
"请选择一个文件:",
accept=[".txt", ".csv", ".json"],
required=True
)
# 获取文件内容
content = file['content']
filename = file['filename']
put_text(f"已上传文件:{filename},大小:{len(content)}字节")
# 根据文件类型处理
if filename.endswith('.txt'):
# 文本文件处理
text_content = content.decode('utf-8')
put_text("文件内容预览:")
put_code(text_content[:500] + "..." if len(text_content) > 500 else text_content)
# 简单统计
lines = text_content.split('\n')
words = text_content.split()
put_table([
['统计项', '结果'],
['行数', len(lines)],
['单词数', len(words)],
['字符数', len(text_content)]
])
elif filename.endswith('.csv'):
# CSV文件处理
df = pd.read_csv(pd.compat.BytesIO(content))
put_text("数据预览(前5行):")
put_table([df.columns.tolist()] + df.head().values.tolist())
# 基本统计
put_text("基本统计信息:")
stats = df.describe()
put_table([stats.index.tolist()] + stats.values.tolist())
elif filename.endswith('.json'):
# JSON文件处理
import json
json_data = json.loads(content)
put_text("JSON内容:")
put_code(json.dumps(json_data, indent=2, ensure_ascii=False))
if __name__ == '__main__':
start_server(file_processor, port=8080)1、零前端门槛:无需HTML/CSS/JS知识,纯Python开发;
2、同步编程模型:代码结构清晰,易于理解和维护;
3、快速原型开发:适合快速验证想法和开发内部工具;
4、丰富的输入输出组件:满足基本交互需求;
5、易于集成:可嵌入现有Flask、Django项目;
1、UI定制性有限:无法实现复杂的交互效果;
2、不适合大型单页应用:对复杂前端交互支持有限;
3、社区相对较小:资源和支持相对较少;
PyWebIO是一个极具实用价值的工具,PyWebIO的强大之处在于它让Python开发者能够专注于业务逻辑,而非前端技术细节,大大提高了开发效率。特别适合以下场景:
项目地址: https://github.com/pywebio/PyWebIO
“无他,惟手熟尔”!有需要的用起来!
如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!