Python 开发交互式 Web 应用,从未如此简单

交互式 Web app 非常实用,比如说做一个问卷调查页面、一个投票系统、一个信息收集表单,上传文件等等,因为网页是可视化的,因此还可以作为一个没有服务端的图片界面应用程序而使用。

如果你有这样的开发需求,那用 Python 真的是太简单了。

借助于 PyWebIO(pip install pywebio),你可以分分钟实现网页的信息录入,可以看下面的动图:

上面的页面,也就仅仅用了这 6 行代码:

from pywebio.input import *input('This is a simple text input')select('This is a drop down menu', ['Option1', 'Option2'])checkbox('Multiple Choices!', options=['a','b','c','d'])radio('Select any one', options=['1', '2', '3'])textarea('Text Area', rows=3, placeholder='Multiple line text input')

要让网页输出想要的信息也是非常简单,代码如下,函数功能已经做了相关注释,你很容易看懂:

from pywebio.output import *from pywebio import session# 网页上显示纯文本put_text('Hello friend!')# 网页上显示表格put_table([    ['Object', 'Unit'],    ['A', '55'],    ['B', '73'],])# 网页上显示 MarkDownput_markdown('~~PyWebIO~~')# 网页上显示下载文件的链接put_file('output_file.txt', b'You can put anything here')# 网页上显示图片put_image(open('python_logo.png', 'rb').read())# 网页上显示弹窗popup('popup title', 'popup text content')# 保持回话是打开状态,否则页面显示完毕程序退出session.hold()

运行的效果如下:

以上,几行代码就实现了一个带有输入输出的 Web 应用,是不是很神奇?

构建基于浏览器的 GUI 程序

PyWebIO 提供了一系列命令式的交互函数来在浏览器上获取用户输入和进行输出,将浏览器变成了一个“富文本终端”,可以用于构建简单的 Web 应用或基于浏览器的 GUI 应用。

比如计算 BMI 指数的脚本:

from pywebio import start_serverfrom pywebio.input import input, FLOATfrom pywebio.output import put_textdef bmi(): height = input('请输入你的身高(cm):', type=FLOAT) weight = input('请输入你的体重(kg):', type=FLOAT) BMI = weight / (height / 100) ** 2 top_status = [(14.9, '极瘦'), (18.4, '偏瘦'), (22.9, '正常'), (27.5, '过重'), (40.0, '肥胖'), (float('inf'), '非常肥胖')] for top, status in top_status: if BMI <= top: put_text('你的 BMI 值: %.1f,身体状态:%s' % (BMI, status)) breakif __name__ == '__main__': start_server(bmi, port=80)

效果:

更多示例:

基本 demo

  • 聊天室[1]: 和当前所有在线的人聊天 (不到 90 行代码实现)
  • Markdown 实时预览[2]: 可以实时预览的在线 Markdown 编辑器 (不到 40 行代码实现)
  • 在线五子棋游戏[3]: 多人协作对战的五子棋游戏 (不到 100 行代码实现)
  • 输入演示[4]: 演示 PyWebIO 输入模块的用法
  • 输出演示[5]: 演示 PyWebIO 输出模块的用法

数据可视化 demo

PyWebIO 还支持使用第三方库进行数据可视化

  • 使用 bokeh 进行数据可视化[6]
  • 使用 plotly 进行数据可视化[7]
  • 使用 pyecharts 创建基于 Echarts 的图表[8]
  • 使用 pyg2plot 创建基于 G2Plot 的图表[9]
  • 使用 cutecharts.py 创建卡通风格图表[10]

数据可视化效果图:

与现有框架集成

PyWebIO 还可以方便地整合进现有的 Web 服务,让你不需要编写 HTML 和 JS 代码,就可以构建出具有良好可用性的应用。目前支持与 Flask、Django、Tornado、aiohttp、FastAPI 框架集成。

比如说与 Tornado 应用整合:

import tornado.ioloopimport tornado.webfrom pywebio.platform.tornado import webio_handlerclass MainHandler(tornado.web.RequestHandler):    def get(self):        self.write('Hello, world')if __name__ == '__main__':    application = tornado.web.Application([        (r'/', MainHandler),        (r'/bmi', webio_handler(bmi)),  # bmi 即为上文计算BMI指数的函数    ])    application.listen(port=80, address='localhost')    tornado.ioloop.IOLoop.current().start()

与 Django 整合:

# urls.pyfrom django.urls import pathfrom pywebio.platform.django import webio_view# `task_func` is PyWebIO task functionwebio_view_func = webio_view(task_func)urlpatterns = [ path(r'tool', webio_view_func),]

与更多框架的整合见文档[11]

最后

PyWebIO 使用同步而不是基于回调的方式获取输入,代码编写逻辑更自然,非声明式布局,布局方式简单高效,代码侵入性小,旧脚本代码仅需修改输入输出逻辑便可改造为 Web 服务,还可以整合到现有的主流 Web 框架。同时支持基于线程的执行模型和基于协程的执行模型,支持结合第三方库实现数据可视化,更多知识请阅读官方文档[12]

一句话,PyWebIO 让交互式的 Web 开发变得更加简单,特别适合开发简单的 GUI 程序及数据可视化。

(0)

相关推荐

  • PyWebIO:像编写终端脚本一样来编写Web应用

    Python爱好者社区 来源:Python中文社区 导言 最开始学习写代码的时候,程序都是运行在终端里的,输入使用input()或者scanf(),输出使用print之类的函数进行交互.相信每个人对这 ...

  • 超详细的 Python 基础语句总结(多实例、视频讲解持续更新)

    目录 一.运算符 1.1 + --两个对象相加 1.2 - --得到负数或是一个数减去另一个数 1.3 * --两个数相乘或是返回一个被重复若干次的字符串.列表.元组 1.4 / --两个数相除 1. ...

  • Python 5 行代码的神奇操作!

    来源:Python 技术「ID: pythonall」 Python 语言实现功能直接了当,简明扼要,今天咱们就来一起看看 Python 5 行代码的神奇操作! 我能行 1.古典兔子问题 有一对兔子, ...

  • Java编程入门:模拟双色球

    不知道大家有没有买过彩票,买彩票要中奖可能很难,但是写出一个彩票的Java代码可是简单好多.今天给大家分享双色球的程序,不到50行代码就搞定,无规律,随机生成. 代码如下: import java.u ...

  • 各种注意力机制,MLP,Re-Parameter系列的PyTorch实现

    作者:xmu-xiaoma666 编译:ronghuaiyang 导读 给出了整个系列的PyTorch的代码实现,以及使用方法. 各种注意力机制 Pytorch implementation of ' ...

  • 爬虫精进6

    ---------如有疑问,欢迎交流指正-------- 第6关 练习-储存电影信息-参考 第一步:分析问题,明确结果 问题需求就是把豆瓣TOP250里面的 序号/电影名/评分/推荐语/链接 都爬取下 ...

  • 使用Angular和ng-bootstrap创建一个输入地址

    在本文中,您将逐步学习如何创建输入地址组件.当我们想要节省空间并更好地在表单中组织输入时,此功能很有用. 用户可以轻松地从一个位置读取和操作地址字段.我们组件的最终输出将如下图所示: 背景 在开始之前 ...

  • 价值2个亿的代码

    前两天朋友圈里看到一段号称"价值一亿"的代码: 可以智能应答,很厉害是不是? 源码: Python 极简版: while True:    print(input('').repl ...

  • 一行Python代码

    Life is short, just use Python. 自从08年接触Python,就有爱不释手的感觉,逐渐地,有些不忍地疏远了Perl 和Shell编程,因为python 的优雅么? 不全是 ...

  • 终于,Python 也可以写前端了

    大家好,我是明哥. 自己这两天也在搞 阿里云服务器 0 元购 的活动,其中有个环节是核验读者的购买资格. 此次参加的读者有几百个,让明哥一个一个核验肯定是不现实的,于是就想着搞一个前端页面让读者可以自 ...