PyWebIO免 HTML、JS 快速构建简单 Web 应用的 Python 库 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
NeilWang
V2EX    分享创造

PyWebIO免 HTML、JS 快速构建简单 Web 应用的 Python 库

  •  36
    &nsp;
  •   NeilWang 2021 年 1 月 19 日 17132 次点击
    这是一个创建于 1827 天前的主题,其中的信息可能已经有所发展或是发生改变。

    和大家分享一下我过去一年投入主要精力写的一个 Python 库PyWebIO 。

    简单说下背景,我之前开发过一个小程序,后台经常有些管理性的操作(比如发布通知、回复反馈等),最开始是通过 ssh 运行脚本来操作,但感觉不太方便,想做成 Web 页面但又觉得写前后端接口很麻烦。

    于是就很希望有一个库,只需要调用一个函数,就可以在浏览器上显示表单,用户提交后函数同步返回表单数据;然后再提供一些函数,可以实时输出各种形式的数据,比如表格、图片、Markdown 等。

    这样相当于把浏览器当成了一个富文本终端,编写 Web 服务就像编写控制台程序一样只需要调用输入输出函数就可以完成交互。找来找去,也没找到满意的工具可以实现这种需求,感觉此需求是普遍存在的,就自己开坑写了一个,于是就有了 PyWebIO 。

    到现在,除了支持最初设想的输入、输出函数外,PyWebIO 还支持布局、事件绑定、并发、协程、与现有的 Web 应用集成等特性,文档也十分的完善。

    总结来说,PyWebIO 能够让你用编写终端程序的逻辑来编写 Web 应用,不需要编写前端页面和后端接口,非常适合在短时间内快速构建对 UI 要求不高的应用(比如自用的 Web 后台、在线小工具等)。PyWebIO 既适合从来没有接触过 Web 开发的程序员来像编写终端程序一样编写 Web 应用,又适合有 Web 开发经验的程序员在自己的 Web 应用中快速实现某些小功能。

    关于 PyWebIO 对传统 Web 的优势可以进一步阅读这篇文章:Why PyWebIO

    GitHub 和文档放在下面了,欢迎大家体验和提出宝贵意见。

    Github: https://github.com/wang0618/PyWebIO
    文档: https://pywebio.readthedocs.io/ (文档里的绝大部分代码示例都有在线演示的链接)

    下面是一些使用 PyWebIO 编写的 Demo 和应用:

    • 输入演示:演示 PyWebIO 输入模块的用法
    • 输出演示:演示 PyWebIO 输出模块的用法
    • 数据可视化:在 PyWebIO 中使用 bokeh 、plotly 、pyecharts 等库进行数据可视化
    • 聊天室:不到 80 行代码实现的在线聊天室
    • mtag_tool:使用 PyWebIO 编写的用于编辑 MP3 标签的应用

    最后贴两个 PyWebIO 输入和输出函数调用效果的动图

    output_demo

    input_demo

    第 1 条附言    2021 年 1 月 19 日
    类似功能的工具还有 dash 和 streamlit,它们和 PyWebIO 都各有特点。

    https://github.com/plotly/dash :可以用来编写全功能的 Web 页面,虽然不需要编写 html,需要先声明布局,且布局声明后无法动态改变。dash 采用“响应式”的程序模型,非常依赖回调。如果只是简单写一个小应用,dash 显得太重,需要的代码量也比 PyWebIO 更多。

    https://github.com/streamlit/streamlit :可以称得上神器,功能上和 PyWebIO 很相似,streamlit 更专注于机器学习和数据科学领域。不过 streamlit 应用的编写逻辑还是没有终端程序那么自然,但熟悉之后,编写 Web 服务需要的代码量比 PyWebIO 更少,另外,streamlit 不支持整合到现有的 Web 服务。
    139 条回复    2023-11-24 16:50:02 +08:00
    1  2  
    Ritter
        1
    Ritter  
       2021 年 1 月 19 日   1
    有意思
    YUX
        2
    YUX  
    PRO
       2021 年 1 月 19 日
    感觉很有用
    YUX
        3
    YUX  
    PRO
       2021 年 1 月 19 日   2
    试了一下 demo 只能说太痛快了
    haoyunyinglai
        4
    haoyunyinglai  
       2021 年 1 月 19 日   1
    插眼,点赞
    w468750
        5
    w468750  
       2021 年 1 月 19 日   1
    插眼,很酷!
    luooo
        6
    luooo  
       2021 年 1 月 19 日 via Android
    很难不资瓷
    vevlins
        7
    vevlins  
       2021 年 1 月 19 日
    楼主
    privil
        8
    privil  
       2021 年 1 月 19 日
    先 star 为敬!流弊
    bolide2005
        9
    bolide2005  
       2021 年 1 月 19 日
    nice
    loading
        10
    loading  
       2021 年 1 月 19 日 via Android   3
    我会前端的就感觉没必要再多学
    gogobody
        11
    gogobody  
       2021 年 1 月 19 日
    @vevlins 强哥,伟民!,能输出到 jupyter 吗,这画图用起来多爽
    renmu123
        12
    renmu123  
       2021 年 1 月 19 日 via Android
    读了一下文档感觉很 cool,我记得 Python 生态里也有一个类似的工具,一下子想不起来名字了。
    希望 input 能支持 date 和 datetime
    NeilWang
        13
    NeilWang  
    OP
       2021 年 1 月 19 日
    @gogobody jupyter 也重写了 input 函数,直接调用也能够从 notebook 中获取输入。另外 PyWebIO 支持的那几个数据可视化的库都可以输出到 jupyter 中,具体可以去看看可视化库的文档
    NeilWang
        14
    NeilWang  
    OP
       2021 年 1 月 19 日
    @renmu123 附言里介绍了我知道的比较相似的工具; date 和 datetime 的支持后面会加上的
    shyling
        15
    shyling  
       2021 年 1 月 19 日
    感觉很实用
    Acoffice
        16
    Acoffice  
       2021 年 1 月 19 日
    期待有更多实用场景的 demo
    shyrock
        17
    shyrock  
       2021 年 1 月 19 日
    感谢高质量分享,暂时用不到似乎。
    vevlins
        18
    vevlins  
       2021 年 1 月 19 日   1
    体验了下,非常好

    我觉得核心的优势是不需要知道前端知识,不需要 MVC 等架构,直接用面向过程的方式把页面和后台逻辑写到一起,简化了很多操作。
    主要目标用户我觉得有部分是一些科研工作者,他们做了一些类似深度学习数据统计之类的程序,但是不好呈现成果。也有很多 python 库的开发者,他们的项目需要下载下来,安装依赖等等才能看到效果,对于一些没有耐心的用户可能就流失了,现在可以方便地启动一个页面
    omph
        19
    omph  
       2021 年 1 月 19 日
    很轻量级,酷
    u 盘上能跑不?
    luooo
        20
    luooo  
       2021 年 1 月 19 日 via Android
    如果想根据个人需求调整布局,操作灵活吗
    luooo
        21
    luooo  
       2021 年 1 月 19 日 via Android
    想尝试做一个推流的应用,楼主方便联系我吗
    Plague
        22
    Plague  
       2021 年 1 月 19 日
    pip 安装问题

    PS C:\Users\George> pip install pywebio
    Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
    Collecting pywebio
    Downloading https://pypi.tuna.tsinghua.edu.cn/packages/6f/67/e56cf94bf53113b7e1f745c9a690014f9ee05c00ca204c310fa79b810e04/pywebio-1.0.0.tar.gz (3.8MB)
    || 3.8MB 88kB/s
    ERROR: Command errored out with exit status 1:
    command: 'c:\users\george\appdata\local\programs\python\python38-32\python.exe' -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\\Users\\George\\AppData\\Local\\Temp\\pip-install-ucisft40\\pywebio\\setup.py'"'"'; __file__='"'"'C:\\Users\\George\\AppData\\Local\\Temp\\pip-install-ucisft40\\pywebio\\setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base pip-egg-info
    cwd: C:\Users\George\AppData\Local\Temp\pip-install-ucisft40\pywebio\
    Complete output (5 lines):
    Traceback (most recent call last):
    File "<string>", line 1, in <module>
    File "C:\Users\George\AppData\Local\Temp\pip-install-ucisft40\pywebio\setup.py", line 13, in <module>
    readme = f.read()
    UnicodeDecodeError: 'gbk' codec can't decode byte 0xa7 in position 1798: illegal multibyte sequence
    ----------------------------------------
    ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
    WARNING: You are using pip version 19.2.3, however version 20.3.3 is available.
    You should consider upgrading via the 'python -m pip install --upgrade pip' command.
    NeilWang
        23
    NeilWang  
    OP
       2021 年 1 月 19 日
    @luooo 对布局只是做了简单的支持,可以参考 https://pywebio.readthedocs.io/zh_CN/latest/guide.html#id12 。另外还可以使用 https://pywebio.readthedocs.io/zh_CN/latest/output.html#pywebio.output.put_widget 这个函数来输出自定义的 html 结构,然后配合 style 标签实现布局。不过 PyWebIO 的初衷还是快速开发一些对布局不太依赖的 Web 应用,需要复杂布局和事件支持的话,还是考虑传统 Web
    mogita
        24
    mogita  
       2021 年 1 月 19 日
    很有意思,比 DHH 的 Hotwire 还刺激!
    NeilWang
        25
    NeilWang  
    OP
       2021 年 1 月 19 日
    @Plague 编码问题,我这就修复一下
    Cyron
        26
    Cyron  
       2021 年 1 月 19 日
    牛逼,赞助你 500 万!
    roudancongji
        27
    roudancongji  
       2021 年 1 月 19 日
    意义党,无用党,风凉话党 还有 30 秒到达战场,顺便,楼主牛逼!!!
    lanyusea
        28
    lanyusea  
       2021 年 1 月 19 日
    专门登录账号回复一下:太酷啦!
    Geekgogo
        29
    Geekgogo  
       2021 年 1 月 19 日
    太顶了,star
    qq7790586
        30
    qq7790586  
       2021 年 1 月 19 日
    @Plague #22 升级 py 版本
    NeilWang
        31
    NeilWang  
    OP
       2021 年 1 月 19 日
    @NeilWang 新发布的 v1.0.1 已经解决这个问题,不过其他的 PyPi 源应该不能及时同步,可以用这个命令安装开发版 pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple https://code.aliyun.com/wang0618/pywebio/repository/archive.zip
    NeilWang
        32
    NeilWang  
    OP
       2021 年 1 月 19 日
    @Plague 刚刚 @ 错了,windows 安装出错参考 31 楼的回复
    youthfire
        33
    youthfire  
       2021 年 1 月 19 日
    看起来很有意思, 这东西可以用来作为 pandas 的 dataframe 前端数据呈现吗?
    shunia
        34
    shunia  
       2021 年 1 月 19 日
    demo 全都挂了啊?连不上 ws
    renyijiu
        35
    renyijiu  
       2021 年 1 月 19 日
    很酷
    v2NPC
        36
    v2NPC  
       2021 年 1 月 19 日
    试了一下,真的好强!!
    NeilWang
        37
    NeilWang  
    OP
       2021 年 1 月 19 日
    @shunia 数据可视化 demo 的有个页面的链接有误,现在已经修复了
    narmgalaxy
        38
    narmgalaxy  
       2021 年 1 月 19 日
    很强!
    DJI360
        39
    DJI360  
       2021 年 1 月 19 日
    很有意思,当初学习 python 的初衷就是 i 选哪个尽可能地简单,现在随便写个网站的话,确实比 flask 这些要快很多了,一个文件就够了
    xiaoxinshiwo
        40
    xiaoxinshiwo  
       2021 年 1 月 19 日
    JustSong
        41
    JustSong  
       2021 年 1 月 19 日
    我提了一个 issue,突然发现作者自己没有 watch 自己的仓库
    Death
        42
    Death  
       2021 年 1 月 19 日
    建议也可以去 hackernews 分享一下,发一个 Show HN
    NeilWang
        43
    NeilWang  
    OP
       2021 年 1 月 19 日
    @Death 等把文档翻译成英文之后再去发
    fcmio
        44
    fcmio  
       2021 年 1 月 19 日 via iPhone
    插言………
    B4PLpPSsR4voMdx0
        45
    B4PLpPSsR4voMdx0  
       2021 年 1 月 19 日
    alinwu05
        46
    alinwu05  
       2021 年 1 月 19 日
    6666
    这个好!
    ctt
        47
    ctt  
       2021 年 1 月 19 日 via Android
    很不错,适合快速上手的小项目
    ctt
        48
    ctt  
       2021 年 1 月 19 日 via Android
    很不错,让非专业人士能更方便地使用 python
    laike9m
        49
    laike9m  
       2021 年 1 月 20 日 via Android
    看看
    fx0719
        50
    fx0719  
       2021 年 1 月 20 日 via iPhone
    厉害了
    LuJason
        51
    LuJason  
       2021 年 1 月 20 日
    nb,已 star
    Plague
        52
    Plague  
       2021 年 1 月 20 日
    @NeilWang 好的谢谢
    winglight2016
        53
    winglight2016  
       2021 年 1 月 20 日
    怎么感觉像是 python 版的 jsp ?

    我本来以为是可以直接 CRUD 了,但是所有交互还是要手工写代码,那这个库是不是主要目标就是做 MVVM 的映射 /数据绑定功能?
    shunia
        54
    shunia  
       2021 年 1 月 20 日
    没懂,我还是打不开 demo 啊,大家都能打开?
    比如这个: http://pywebio-demos.demo.wangweimin.site/?pywebio_api=bmi
    打开之后 GET http://pywebio-demos.demo.wangweimin.site/bmi?test=1 返回 400 啊
    welkinzh
        55
    welkinzh  
       2021 年 1 月 20 日
    看着挺有意思的,祝越做越好
    yuhangch
        56
    yuhangch  
       2021 年 1 月 20 日
    @ctt 应该是,让不熟悉前端的人士更方便的做个网页,哈哈
    chippai
        57
    chippai  
       2021 年 1 月 20 日
    点赞、支持、star 三连
    275761919
        58
    275761919  
       2021 年 1 月 20 日
    先 star 为敬,太强了
    NeilWang
        59
    NeilWang  
    OP
       2021 年 1 月 20 日
    @shunia 这个 demo 是没问题的,可以尝试换个网络或者浏览器试试。至于返回 400 的接口,那是在探测后端是使用的 WebSocket 协议还是 HTTP 协议,如果使用了 HTTP 协议,会返回 200 的。
    shunia
        60
    shunia  
       2021 年 1 月 20 日
    @NeilWang #59 居然是不支持 firefox
    cdyrhh
        61
    cdyrhh  
       2021 年 1 月 20 日
    牛逼
    efaun
        62
    efaun  
       2021 年 1 月 20 日
    有丶意思
    xuanli
        63
    xuanli  
       2021 年 1 月 20 日
    star
    mon6912640
        64
    mon6912640  
       2021 年 1 月 20 日
    666
    NeilWang
        65
    NeilWang  
    OP
       2021 年 1 月 20 日
    @shunia #60 我在 firefox 试了,没发现问题♂ 。可以的话请在 Github 上提交一个 issue
    deplives
        66
    deplives  
       2021 年 1 月 20 日
    厉害了,给个 start
    zxcslove
        67
    zxcslove  
       2021 年 1 月 20 日
    star 为敬
    EKkoGG
        68
    EKkoGG  
       2021 年 1 月 20 日
    好像很爽的样子,支持!
    Prkom
        69
    Prkom  
       2021 年 1 月 20 日
    star!!
    xJogger
        70
    xJogger  
       2021 年 1 月 20 日
    和 Vercel 完美配合,以后小脚本再也不怕没地方放啦。
    dome: https://cap2code.nodealpha.me/
    code: https://github.com/xJogger/cap2code_vercel/
    用途介绍: https://www.nodealpha.me/Code-CapValue2Code.html
    wudaye
        71
    wudaye  
       2021 年 1 月 20 日 via Android
    不错啊,个人认为这种免前端设计的库早该出现了
    u823tg
        72
    u823tg  
       2021 年 1 月 20 日
    cool star !!
    maemolee
        73
    maemolee  
       2021 年 1 月 20 日
    感觉牛逼!
    Tink
        74
    Tink  
    PRO
       2021 年 1 月 20 日
    卧槽,这个确实是我梦寐以求的
    Rorysky
        75
    Rorysky  
       2021 年 1 月 20 日
    excited 特别适合 后端搞个小工具
    qanniu
        76
    qanniu  
       2021 年 1 月 20 日
    @xJogger 一个小脚本就占用一个 vps 80 端口了,请问您怎么解决的.
    https://cap2code.nodealpha.me:80
    xJogger
        77
    xJogger  
       2021 年 1 月 20 日 via Android
    @qanniu 啊?这个小脚本是跑在 vercel 上的呀,不是跑在 vps 上,不用考虑端口的问题。
    如果你要在 vps 上跑的话,脚本指定一个非 80 端口,用 nginx 反代一下会好点,这样还能解决 ssl 的问题。
    Cabana
        78
    Cabana  
       2021 年 1 月 20 日
    cool~
    BBCCBB
        79
    BBCCBB  
       2021 年 1 月 20 日
    有想法, 够噱头, 有搞头
    xiaoxinshiwo
        80
    xiaoxinshiwo  
       2021 年 1 月 20 日
    Request URL: http://localhost:51203/js/pywebio.min.js
    Request Method: GET
    Status Code: 404 Not Found
    Remote Address: [::1]:51203
    Referrer Policy: strict-origin-when-cross-origin

    这个咋回事呢
    reiji
        81
    reiji  
       2021 年 1 月 20 日 via Android
    见证历史了,推荐给朋友用用
    Arrowing
        82
    Arrowing  
       2021 年 1 月 20 日   1
    适合单兵作战的快速开发,需要具备相关知识。
    不适于多人协同开发,难以维护,没有前后端分离。
    EKkoGG
        83
    EKkoGG  
       2021 年 1 月 20 日
    @xJogger
    感谢老哥安利,有用!
    ydpro
        84
    ydpro  
       2021 年 1 月 20 日
    太顶了!
    NeilWang
        85
    NeilWang  
    OP
       2021 年 1 月 2 日
    @xiaoxinshiwo #80 能否去 Github 提一个可复现问题的 issue 呢
    xiaoxinshiwo
        86
    xiaoxinshiwo  
       2021 年 1 月 20 日
    @NeilWang #85 嗯,我就把代码 clone 下来,安装了依赖,跑了下你的 demo,web 端是空白页
    JackalZhao
        87
    JackalZhao  
       2021 年 1 月 20 日
    太酷了!
    Lrony
        88
    Lrony  
       2021 年 1 月 20 日
    强 强 强
    vevlins
        89
    vevlins  
       2021 年 1 月 20 日
    github star 飙升中,牛
    kaiki
        90
    kaiki  
       2021 年 1 月 20 日
    早就该有这种东西了,牛逼
    tankeco
        91
    tankeco  
       2021 年 1 月 20 日
    今天试用了一下~有个问题,input 提交后怎么让它还显示着..
    NeilWang
        92
    NeilWang  
    OP
       2021 年 1 月 20 日
    @xiaoxinshiwo github 上的仓库 clone 无法直接运行,因为需要手动构建前端需要的 js,可以使用这个镜像仓库 https://code.aliyun.com/wang0618/pywebio.git
    这个仓库在 github 仓库的基础上添加了自动构建的 js 依赖
    NeilWang
        93
    NeilWang  
    OP
       2021 年 1 月 20 日
    @tankeco #91 PyWebIO 的设计就是输入表单在成功提交后就销毁,因为 PyWebIO 的输入是阻塞式的,一旦提交输入函数就返回了,表单还留在界面上是没有意义的。如果想和终端程序一样,还留存用户输入的内容,可以在用户输入后直接调用输出函数将内容输出出来。
    codehz
        94
    codehz  
       2021 年 1 月 20 日
    @NeilWang #93 你可以考虑把提交了的就变成禁用的,作为一个记录的功能
    tankeco
        95
    tankeco  
       2021 年 1 月 20 日
    @NeilWang 感觉这也是和 streamlit 很不一样的地方,我的场景里经常会需要修改输入,但 streamlit 好卡..
    xiaoxinshiwo
        96
    xiaoxinshiwo  
       2021 年 1 月 20 日
    @NeilWang #92 收到
    Deteriorator
        97
    Deteriorator  
       2021 年 1 月 21 日
    cool, 插个眼
    Rorysky
        98
    Rorysky  
       2021 年 1 月 21 日
    再次回复, 泪流满面,太好用了
    NeilWang
        99
    NeilWang  
    OP
       2021 年 1 月 21 日
    @tankeco "需要经常修改输入"的话,可以考虑将接收输入以及后续操作放到一个 while 循环中。或者在页面上放置一个 button,在 button 的点击回调函数中调用输入函数来获取输入并进行后续操作。
    qanniu
        100
    qanniu  
       2021 年 1 月 21 日
    @xJogger 谢谢,目前想到的方案就是您说的,反代.
    想看看你有木有更优雅的方法.
    1  2  
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5785 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 48ms UTC 06:19 PVG 14:19 LAX 22:19 JFK 01:19
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86