6 ms·
Show HN: PyWebIO – Write interactive web app in script way
- Wang0618 6y agoPyWebIO is a Python library which provides a series of imperative functions to obtain user input and output on the browser. The input function of PyWebIO is blocking, and the output function will output content to user in real time. You can use PyWebIO to build simple web applications or browser-based GUI applications without the need to have knowledge of HTML and JS. The way of writing PyWebIO applications is more like writing a terminal program. You can think of the browser as a rich text terminal while writing PyWebIO app. If you have a terminal script, you only need to replace the input and output functions with PyWebIO's functions to turn your terminal script to a web application. Features: - Support click events, layout and output updates. - Support integration into existing web project, currently supports Flask, Django, Tornado, aiohttp framework. - Support for asyncio and coroutine. - Compatible with data visualization libraries, e.g., plotly, bokeh, pyecharts. Links: - Demos: http://pywebio-demos.demo.wangweimin.site/ http://pywebio-demos.demo.wangweimin.site/ - Documents: https://pywebio.readthedocs.io/en/latest/ https://pywebio.readthedocs.io/en/latest/ PS: I am not a native speaker of English, so the documents may be a bit obscure. If you have any questions, please feel free to discuss on https://github.com/wang0618/PyWebIO/discussions https://github.com/wang0618/PyWebIO/discussions
- jimsparkman 6y agoFantastic work! This looks like an arguably better/more generalized version of something like Streamlit. Great concept for building rapid applications.
- hultner 6y agoLooks really cool, I love how simple it is.
- deleted 6y ago[deleted]
- offtop5 6y agoLooks great, the docs look fine to me, but I would love instructions on how to deploy these applications. I imagine this will let Python devs create small web front ends very easily .
- raghavkhanna 6y agoperhaps this link might help https://pywebio.readthedocs.io/en/latest/guide.html#server-mode-and-script-mode https://pywebio.readthedocs.io/en/latest/guide.html#server-m...
- canada_dry 6y ago> the docs look fine to me I object! The docs and examples are fantastic.
- RandomWorker 6y agoThis is awesome! I'm going to use this to make a couple of applications! I've been looking for something to quickly make something easy for my clients. I'll probably put these behind a user-pass, but are there any issues that might arise security wise?
- Wang0618 6y agoYou can place a password validation input at the beginning of the code and return directly if the validation does not pass. PyWebIO ensures that only users who have passed the validation can continue with the rest of the code.
- raghavkhanna 6y agoI really like the concept, thanks for sharing!
- OttPeterR 6y agoAs someone who has only done back end for years and is lazy and don’t want to learn front end stuff, this is an inviting way to break into that world for me.
- pytlicek 6y agoThanks for sharing. This is really awesome!
- JPKab 6y agoHow is this different from streamlit? Curious.
- Wang0618 6y agoStreamlit uses a responsive way to get input and doesn't rely on callbacks at all. Every time a user interacts with a widget, your script is re-executed and the output value of that widget is set to the new value during that run. It's amazing but also a little hard to understand. In contrast, the way of writing PyWebIO app is more like writing a terminal program, except that the terminal here becomes a browser. The output functions will output content to user in real time, and the input functions will block until the user submit the input form.
- JPKab 6y agoExcellent work, and thank you for sharing! I see some immediate applications for this at my job. Much appreciation!
- yamrzou 6y agoSo, PyWebIO doesn't re-execute the whole script like Streamlit does? I use streamlit, and that's one of its pain points. If the script is complicated, re-execution becomes slow. Also does PyWebIO support defining inputs based on other ones? For example, to have a hierarchy of dropdowns (select company --> based on that selection, select employee --> etc).
- Wang0618 6y agoPyWebIO won't re-execute the whole script. In pywebio, if the code executes to the end, the user session will also be closed. You can use `while` loop in your code to continuously receive user input in PyWebIO app. PyWebIO now support defining inputs based on other ones, but I haven't written this feature into the documentation. Until then, you can solve this problem by splitting inputs with dependencies into multiple forms. (you can use first form to get company and then use another form to get employee)
- 6y ago
- deleted 6y ago[deleted]
- vsskanth 6y agoExamples and demo gifs look simple and easy to understand.
- 55555 6y agoI would love to use this. How do I deploy it to the web easily and cheaply?
- floatingleaf 6y agohttps://github.com/codevin/script-manager https://github.com/codevin/script-manager The idea here is to standardize widgets and use them from scripts. For now, it emulates whiptail command line which provides text widgets.
- bernardv 6y agoThis is great. Does it rely on web sockets?
- crazypython 6y agoIt seems to stream the HTML over the original HTTP socket– web browsers can render incomplete streams of HTML.
- lovasoa 6y agoLooking at it from the web inspector, yes, it's entirely over websockets, sending json messages : {"event":"input_event","task_id":"main-140213579376912","data":{"event_name":"blur","name":"weight","value":"21"}} {"command": "output", "spec": {"type": "markdown", "content": "Your BMI: `1458.3`, Category: `Severely obese`", "sanitize": true, "scope": "#pywebio-scope-ROOT", "position": -1}, "task_id": "main-140213579376912"}
- Wang0618 6y agoBoth http and websocket protocol can be used to implement server-browser communication in PyWebIO. The websocket is default, and you can use `pywebio.platform.tornado_http.start_server()` or `pywebio.platform.path_deploy_http()` to use http polling to communicate.
- clipradiowallet 6y agoThis was easy to install and get started with. I have a [ton] of one-off python scripts for various work-related purposes we all use. Things like PyWebIO can make them accessible to management types, who aren't going to read the usage or spend time understanding how to call them via CLI properly. Thanks to the author!
- protoduction 6y agoYou could run them in the browser using something like Pyodide [0]! [0]: https://github.com/iodide-project/pyodide https://github.com/iodide-project/pyodide
- bbaumgar 6y agoBetween idom[0], streamlit[1], anvil[2], and PyWebIO this space is moving quickly. While it's a little rough around the edges, idom has worked great for us. I look forward to trying out PyWebIO at some point - it targets a different but valid use case. [0] idom-docs.herokuapp.com/ [1] https://streamlit.io/ https://streamlit.io/ [2] https://anvil.works/ https://anvil.works/
- imhoguy 6y agoThat is cool stuff! Does anyone know something like these in Ruby ecosystem? For heavily invested in RoR apps such rapid prototyping from `irb`/`pry` would be a day saver.
- Aliabid94 6y agoGradio is another one optimized for testing functions / ML models. https://gradio.app https://gradio.app
- ampdepolymerase 6y agoGradio does not use WebSockets for its interactivity. The UI will be slower than the others.
- hirot890p 6y agoLooks awesome! Please add a step by step guide to deploy it to a web server.
- Wang0618 6y agoYou can check this section first: https://pywebio.readthedocs.io/en/latest/guide.html#server-mode-and-script-mode https://pywebio.readthedocs.io/en/latest/guide.html#server-m... More details about deployment will be added to the documentation later.
- TruthWillHurt 6y agoDid I just spend 100k building a React portal for nothing?? :D
- erichurkman 6y agoYou built it so you can refactor it when React `${v+1}` comes out, or when Webpack `${v+.1}` breaks your build. I may or may not have dropped an /s somewhere on the floor.
- simtel20 6y agoI'm giving this a spin for a small experiment that I'm playing with, however I need this to run alongside other code. I see the example for getting pywebio to work with its support python web frameworks end up at this: webio_view(task_func) However, I'm not clear on what task_func is, what arguments it takes, etc. Is there an example of a function like this working with any of the supported web frameworks?