用 Python 开发交互式 Web 应用,So Easy

AirPython 2021-10-27 17:17:52
Python 开发 交互 交互式 发交

今天分享一个让开发交互式 Web app 超级简单的工具。不会 HTML,CSS,JAVASCRIPT 也没事。

交互式 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'],
])

# 网页上显示 MarkDown
put_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_server
from pywebio.input import input, FLOAT
from pywebio.output import put_text

def 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))
            break

if __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.ioloop
import tornado.web
from pywebio.platform.tornado import webio_handler

class 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.py

from django.urls import path
from pywebio.platform.django import webio_view

# `task_func` is PyWebIO task function
webio_view_func = webio_view(task_func)

urlpatterns = [
    path(r"tool", webio_view_func),
]

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

最后

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

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

写到这里,又来求赞,求在看了,如果觉得有用,欢迎分享给需要的朋友。也可以关注我,每天学习一个小技术。

参考资料

[1]

聊天室: https://pywebio-demos.pywebio.online/chat_room

[2]

Markdown 实时预览: https://pywebio-demos.pywebio.online/markdown_previewer

[3]

在线五子棋游戏: https://pywebio-demos.pywebio.online/gomoku_game

[4]

输入演示: https://pywebio-demos.pywebio.online/input_usage

[5]

输出演示: https://pywebio-demos.pywebio.online/output_usage

[6]

使用 bokeh 进行数据可视化: http://pywebio-charts.pywebio.online/?app=bokeh

[7]

使用 plotly 进行数据可视化: http://pywebio-charts.pywebio.online/?app=plotly

[8]

使用 pyecharts 创建基于 Echarts 的图表: http://pywebio-charts.pywebio.online/?app=pyecharts

[9]

使用 pyg2plot 创建基于 G2Plot 的图表: http://pywebio-charts.pywebio.online/?app=pyg2plot

[10]

使用 cutecharts.py 创建卡通风格图表: http://pywebio-charts.pywebio.online/?app=cutecharts

[11]

文档: https://pywebio.readthedocs.io/zh_CN/latest/advanced.html#integration-with-web-framework

[12]

官方文档: https://pywebio.readthedocs.io/zh_CN/latest/

版权声明
本文为[AirPython]所创,转载请带上原文链接,感谢
https://toutiao.io/k/w509ve9

  1. LPC55S69 MicroPython模组和库函数
  2. LPC55S69 IoT Kit专属 Micropython模组和库函数简介
  3. 使用soundcard在Python中操作声卡
  4. 自动化快速上手--Python(7)--【字典】--每天半小时
  5. Python之循环结构【包括列表、for语句、range()函数、while语句、循环嵌套、break、continue、算法优化等】
  6. Python模块安装与异常处理详解(numpy、pygame、matplotlib等)
  7. Python__init__.py作用
  8. python 爬取网页时出现多种错误
  9. Python中关于大量绘制速度曲线的问题
  10. python-async的安装和使用方法
  11. Matlab的fread(fild,1,int32)迁移到python变成什么
  12. 想用python开发一个音频过滤器,请指导?
  13. python使用openpyxl读取Excel文件显示No such file or directory
  14. xmoji虚拟头像交互如何使用python(像深度学习)制作?
  15. python 打开页面页面的链接,为什么总是报错呀?
  16. Python中DataLoader的batch_size、shuffle的疑惑。
  17. python安装pymssql库,可以import,但无法调用函数
  18. 【Python学习教程】常用的8个Python数据可视化库!
  19. python处理csv中的时间
  20. 数据结构,元音统计(Python)
  21. python的site-packages复制直接到其他电脑环境上能用吗
  22. Pycharm如何给项目配置python解释器
  23. conda创建python虚拟环境
  24. Python selenium的爬虫无法完整爬取整个页面的内容
  25. 高清版!这18张 Python 数据科学速查表,让你的代码变得更强大!
  26. python代码不会敲,请好心老哥帮助我一下
  27. Python敲七输出符合的个数
  28. Python 有人能给提供简单的思路嘛
  29. python单次运行写入csv成功,循环写入失败
  30. python利用os模块进行增量备份
  31. 【算法学习】807. 保持城市天际线(java / c / c++ / python / go / rust)
  32. 如何利用python输出等腰杨辉三角
  33. python按键执行倒计时小程序不能实现要求,要怎么改才好?
  34. Python request模块post请求的问题
  35. Django连接已有Oracle时的主键设置问题,没主键无法查询怎么办?
  36. 如何用python的dictionary编写一个联系人通讯录程序
  37. 如果Python里range反向输出,不输出步长会怎么样?
  38. 一个关于Python pip的问题: 出现Cannot open \python\Scripts\pip-script.py报错
  39. 富婆闺蜜非让我用Python给她写个淘宝双十一抢购脚本,那只能安排了
  40. 【全网最全】python正则表达式大全,所有讲解都在这,包教包会,学不会找我!
  41. AI python课和 python课都是198 这两个课是同一个课程内容吗?有什么区别和相似点?
  42. python的__new__()疑问
  43. Python代码阅读(第24篇):根据筛选函数将列表元素分成两组
  44. python怎么实现动态障碍物按固定路径行走
  45. Python代码阅读(第24篇):根据筛选函数将列表元素分成两组
  46. Python题目,希望帮我解答一下辛苦
  47. python +selenium 如何获取下拉列表,默认选中值
  48. 有个pb文件做好的模型,对此模型的操作想用python封装成api,怎么做?
  49. 请问,mac的Pycharm中新建项目时候的Base interpreter选项里有两个Python3.8,该选哪个?
  50. python如何读取指定文件名的excel并分别汇总
  51. 如何写利用python将fastq文件转换成fasta文件的脚本
  52. python小工具
  53. 新猿0基础python教程 如何写好接口文档
  54. 请问我哪里错了呀,数值计算,python运算符号出错,但是我看不出来
  55. Python游戏开发,Pygame模块,Python从零开始带大家实现一个魔塔小游戏(2)
  56. Python爬虫实战,requests模块,Python实现抓取王者荣耀全套皮肤
  57. Python游戏开发,Pygame模块,Python从零开始带大家实现一个魔塔小游戏(3)
  58. 大神们这个问题用python怎么解决啊
  59. 简单理解python装饰器
  60. 货物托运收费问题用python 求解 一直输出错误