Skip to content

Commit efb3491

Browse files
committed
feat: add web_server mode
1 parent 96e936e commit efb3491

File tree

5 files changed

+80
-2
lines changed

5 files changed

+80
-2
lines changed

app/src/index.tsx

+3
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,9 @@ function GWalker(props: IAppProps, id: string) {
365365
case "gradio":
366366
preRender = initOnHttpCommunication;
367367
break;
368+
case "web_server":
369+
preRender = initOnHttpCommunication;
370+
break;
368371
default:
369372
preRender = defaultInit;
370373
}

examples/web_server_demo.py

+73
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
"""
2+
pygwalker>=0.4.8.6
3+
4+
This is poc for PygWalker integration with FastAPI.
5+
6+
If you want to use Graphic-Walker in your web application, the best practice is to use Graphic-Walker as a separate front-end component for development, rather than using pygwalker.
7+
8+
run it: uvicorn web_server_demo:app --reload --port 8000
9+
view it: http://127.0.0.1:8000/pyg_html/test0
10+
"""
11+
from typing import Dict, Any
12+
import json
13+
14+
from fastapi import FastAPI, Body
15+
from fastapi.responses import HTMLResponse, JSONResponse
16+
from pygwalker.api.pygwalker import PygWalker
17+
from pygwalker.communications.base import BaseCommunication
18+
from pygwalker.utils.encode import DataFrameEncoder
19+
from pygwalker import GlobalVarManager
20+
import pandas as pd
21+
22+
app = FastAPI()
23+
24+
25+
def init_pygwalker_entity_map() -> Dict[str, PygWalker]:
26+
"""Register PygWalker entity"""
27+
GlobalVarManager.set_privacy("offline")
28+
df = pd.read_csv("https://kanaries-app.s3.ap-northeast-1.amazonaws.com/public-datasets/bike_sharing_dc.csv")
29+
walker = PygWalker(
30+
gid="test0",
31+
dataset=df,
32+
field_specs=None,
33+
spec="",
34+
source_invoke_code="",
35+
theme_key="vega",
36+
appearance="light",
37+
show_cloud_tool=False,
38+
use_preview=False,
39+
kernel_computation=True,
40+
use_save_tool=False,
41+
is_export_dataframe=False,
42+
kanaries_api_key="",
43+
default_tab="vis",
44+
cloud_computation=False,
45+
gw_mode="explore",
46+
)
47+
comm = BaseCommunication(walker.gid)
48+
walker._init_callback(comm)
49+
return {
50+
walker.gid: walker
51+
}
52+
53+
54+
pygwalker_entity_map = init_pygwalker_entity_map()
55+
56+
57+
@app.post("/_pygwalker/comm/{gid}")
58+
def pygwalker_comm(gid: str, payload: Dict[str, Any] = Body(...)):
59+
if gid not in pygwalker_entity_map:
60+
return {"success": False, "message": f"Unknown gid: {gid}"}
61+
62+
comm_obj = pygwalker_entity_map[gid].comm
63+
result = comm_obj._receive_msg(payload["action"], payload["data"])
64+
return JSONResponse(content=json.loads(json.dumps(result, cls=DataFrameEncoder)))
65+
66+
67+
@app.get("/pyg_html/{gid}")
68+
def pyg_html(gid: str):
69+
walker = pygwalker_entity_map[gid]
70+
props = walker._get_props("web_server")
71+
props["communicationUrl"] = "_pygwalker/comm"
72+
html = walker._get_render_iframe(props, True)
73+
return HTMLResponse(content=html)

pygwalker/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from pygwalker.services.global_var import GlobalVarManager
1111
from pygwalker.services.kaggle import show_tips_user_kaggle as __show_tips_user_kaggle
1212

13-
__version__ = "0.4.8.5"
13+
__version__ = "0.4.8.6"
1414
__hash__ = __rand_str()
1515

1616
from pygwalker.api.jupyter import walk, render, table

pygwalker/api/pygwalker.py

+2
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ def __init__(
102102
self._last_exported_dataframe = None
103103
self.default_tab = default_tab
104104
self.cloud_computation = cloud_computation
105+
self.comm = None
105106
check_update()
106107
# Temporarily adapt to pandas import module bug
107108
if self.kernel_computation:
@@ -326,6 +327,7 @@ def _get_chart_by_name(self, chart_name: str) -> ChartData:
326327

327328
def _init_callback(self, comm: BaseCommunication, preview_tool: PreviewImageTool = None):
328329
upload_tool = BatchUploadDatasToolOnWidgets(comm)
330+
self.comm = comm
329331

330332
def reuqest_data_callback(_):
331333
upload_tool.run(

pyproject.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ dependencies = [
2525
"requests",
2626
"arrow",
2727
"sqlalchemy",
28-
"gw_dsl_parser==0.1.48a5",
28+
"gw_dsl_parser==0.1.48a6",
2929
"appdirs",
3030
"segment-analytics-python==2.2.3",
3131
"pandas",

0 commit comments

Comments
 (0)