Python 開發交互式 Web 應用,從未如此簡單!

今天分享一個讓開發交互式 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

數據可視化 demo

PyWebIO 還支持使用第三方庫進行數據可視化

數據可視化效果圖:

與現有框架集成

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 程序及數據可視化。

寫到這裏,又來求贊,求在看了,如果覺得有用,歡迎分享給需要的朋友。也可以關注我,每天學習一個小技術。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/w4geqzmuqAXvE78257jQ2Q