Python 折腾 web 交互的痛 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
kice
V2EX    Python

Python 折腾 web 交互的痛

  •  
  •   kice 2023-01-01 17:49:46 +08:00 7193 次点击
    这是一个创建于 1088 天前的主题,其中的信息可能已经有所发展或是发生改变。

    py 折腾数据可视化是真的痛。各花了一个小时去看 pywebio 和 nicegui 的文档和魔改 demo ,但是发现还是不太舒服。

    先说我的需求: 一个监控系统,用于显示任务进度信息(例如,当前进度,日志显示,脚本变量); 大体上可以看作搞一个 prometheus+tensorboard 的 GUI 。

    想着是开一个 HTTP 服务器监听任务信息,然后套一个前端做可视化; 前端获取任务信息进行动态更新。

    pywebio 和 nicegui ,或者说其他库,例如 streamlit 啥的都是基于多会话设计,也就是访问之间没有多大关联。然后实现上来说,同一个脚本开一个 HTTP 服务器监听,然后再跑一个 UI 框架是行不通。

    换句话说,监听任务信息的 HTTP 服务器单独一个脚本,然后 UI 框架再额外一个脚本,之间使用 HTTP 或者数据库进行通信。这样折腾下来不仅部署挺麻烦,还要受限与 UI 框架。

    目前得出来结论是,用 jQuery+Bootstrap+Ajax 是最合适。最大的痛点是 UI 控件以及要熟悉 CSS 排版。

    如果弄 react/vue 什么的,UI 控件齐全,但是环境搭建好的时候,用前面的方法应该已经做完了。本身一共就不超过 300 行代码,折腾来折腾去不就是为了省时间。

    不知道 dalao 们有什么其他想法?

    19 条回复    2023-01-05 17:47:42 +08:00
    emperinter
        1
    emperinter  
       2023-01-01 17:56:56 +08:00
    python 可视化有个 pyecharts 可以了解一下
    rabbbit
        2
    rabbbit  
       2023-01-01 17:58:26 +08:00
    如果就类似大屏这种就一个页面,确实没必要折腾 react/vue.
    Ct5T66PVR1bW7b2z
        3
    Ct5T66PVR1bW7b2z  
       2023-01-01 17:59:29 +08:00
    去年,应该说前年年底,做过几十个这种可视化的学生案例,基本上就用 pyecharts 搞定,当然,这都少不了对前端的研究(刨网上代码)
    rabbbit
        4
    rabbbit  
       2023-01-01 18:01:55 +08:00
    而且大屏这种页面可能一直开着好几个月都不关,搞复杂了内存泄漏也不好 debug
    shinession
        5
    shinession  
       2023-01-01 18:04:42 +08:00
    OP 试过 plotly dash 没?内置后端 flask ,前端 react ,即开即用,比 strealit 强大很多
    kice
        6
    kice  
    OP
       2023-01-01 18:05:54 +08:00
    @emperinter @Abbeyok 感谢意见。

    不过我这边也不主要是图表: 进度条,日志,图片。
    感觉通用的 UI 框架比较满足需求。
    kice
        7
    kice  
    OP
       2023-01-01 18:40:56 +08:00
    @shinession 不太行,而且用上了 flask 之类的库就不能同一个脚本里监听 HTTP 了。
    我感觉 dash 在这里只是一个 py 版的劣化 jquery; 因为需要大量操作 dom ,不如直接 jquery + ajax 。
    cmhonker
        8
    cmhonker  
       2023-01-01 18:56:27 +08:00
    有个轮子,改吧改吧就能用了。。

    github.com/cppla/ServerStatus
    DonaldVVV
        9
    DonaldVVV  
       2023-01-01 20:34:11 +08:00
    `用 jQuery+Bootstrap+Ajax 是最合适。最大的痛点是 UI 控件以及要熟悉 CSS 排版。`
    可以试试 flask + layui ,基本不怎么写 css 代码
    找一套稍微靠近点的模板,然后手撸一点界面
    layui 的支持还是挺强大的,会 py 的话,学习成本不会很高
    而且对进度条、图片都有比较成熟了的
    Richard14
        10
    Richard14  
       2023-01-01 20:34:57 +08:00   5
    看了两遍也没看懂 OP 说什么,OP 自己看一遍能看懂吗?
    首先你的需求到底是什么,究竟是简单还是复杂。如果真的很简单,你直接手写,有发帖吐槽的功夫早都写完了。如果是复杂的,那你还非得强行用别人的库组装?而且你说为了省代码,真想省代码 prometheus 满足不了你的需求?
    其次实现方法这么多,你有一万种实现方法,没看懂楼主写的所谓受限于前端框架,受限于后端框架是什么意思。
    第三我从头看到尾只看到一个蛋疼的人,帖子一开头来一句 py 折腾数据可视化真的痛,我没看到哪里跟 python 发生关系了
    wittyfans
        11
    wittyfans  
       2023-01-01 23:43:49 +08:00
    任务的这些数据存到数据库呗,然后可视化用 Dash, Streamlit 或者 Metabase 都不错。
    jones2000
        12
    jones2000  
       2023-01-02 00:25:55 +08:00
    前端体力活, 直接外包呗,定义好接口基本就可以了。每必要什么都自己搞,做自己擅长的事,其他外包。
    kice
        13
    kice  
    OP
       2023-01-02 02:02:12 +08:00 via Android
    @Richard14
    需求不复杂但是也不简单,只是需求不是常见的那些类型。

    我想要的东西,一言蔽之,只需要处理用户事件,然后更新界面内容就行。前端的技术框架,前后端的通信方式,甚至是数据存储方面我都不关心。或者类似 imgui 那样的风格,Immediate mode 渲染 HTML 。

    目前我做完大概 py 服务器端 300 行,js 100 行,html+css 50 行。两文件复制到服务器,有 Python 就能直接运行。

    如果用上其他各种框架,我认为代码量和开发时间并不会变少,而且还需要折腾一堆配置文件以及服务端程序部署。

    于是想要一个方法能更快去完成这个轮子,这样以后每个项目都能用上。如果发个帖子能得到答案我觉得值得。

    ---

    我指局限性并不止是“能不能做”,也包括“会不会增加开发成本”。

    提到的可视化框架,在前端上,运行时构建 UI 会比较难折腾。在框架下实现运行时数据绑定和 UI 内容和布局更新并不比直接写 js 操作 DOM 简单。

    后端我想要单个脚本单例全局变量(现有代码都是单脚本单例模式),但是 Python 的后端框架是提倡 stateless ,后端逻辑和状态数据分开。

    其次如果用之前提到的可视化框架,后端设计上就受限制这些设计理念。我的想法并不是不能实现,但是做不到开箱即用,而且不能很好移植到现有的脚本(需要通过数据库或者远程 API 通信)。

    我就存几个关了程序就不要的 kv ,就没有必要再搞个 redis 或者 mysql 服务器了。

    ---

    因为 Python 的可视化开发库不太行,所以可视化和 Python 没啥关系。
    mingl0280
        14
    mingl0280  
       2023-01-02 05:41:18 +08:00 via Android
    你提的问题和“Python 可视化库”并没有什么关系。
    要图表好看,前端用 echarts 和 bootstrap 加上 axios 足够了,Python 仅用来提供数据罢了,可视化用这个真没啥必要。
    37Y37
        15
    37Y37  
       2023-01-02 10:53:11 +08:00
    如果没理解错的话,这样的需求我开发过,这个 https://blog.ops-coffee.cn/s/mml5jzqvdzbyf0f3sjn5dg ,就 jQuery+Bootstrap+Ajax
    jun4rui
        16
    jun4rui  
       2023-01-03 08:56:04 +08:00
    Vue 应该很简单啊,不要走 webpack 编译直接 HTML 中插 js 的方式最简单了,不折腾开发环境。

    然后在 ECharts 的例子里面调代码,然后把 js 代码直接帖到 html 去,换一下数据来源就好了。

    PY 好好做 json 数据接口就好了
    wenqiang1208
        17
    wenqiang1208  
       2023-01-03 10:32:51 +08:00
    如果有底层数据源的话,可以直接搭建开源的 BI 平台, 比如 superset ,用 docker 搭建好后,把数据源链接配置好,直接拖拽生成看板
    wenqiang1208
        18
    wenqiang1208  
       2023-01-03 10:33:26 +08:00
    @wenqiang1208 另外 superset 后端 也是 python ,可以参考参考
    yagamil
        19
    yagamil  
       2023-01-05 17:47:42 +08:00
    前端会一个框架就满地走。反正都是套
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1133 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 17:53 PVG 01:53 LAX 09:53 JFK 12:53
    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