Skip to content

Instantly share code, notes, and snippets.

@timkpaine
Created November 17, 2024 20:43

Revisions

  1. timkpaine created this gist Nov 17, 2024.
    5 changes: 5 additions & 0 deletions Perspective FastAPI Uvicorn
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,5 @@
    Example of perspective multiworker webserver (independent perspective instances)

    ```bash
    uvicorn server:app --workers 4
    ```
    36 changes: 36 additions & 0 deletions index.html
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,36 @@
    <html>
    <head>
    <script type="module" src="https://cdn.jsdelivr.net/npm/@finos/perspective/dist/cdn/perspective.js"></script>
    <script type="module" src="https://cdn.jsdelivr.net/npm/@finos/perspective-viewer/dist/cdn/perspective-viewer.js"></script>
    <script type="module" src="https://cdn.jsdelivr.net/npm/@finos/perspective-viewer-datagrid/dist/cdn/perspective-viewer-datagrid.js"></script>
    <script type="module" src="https://cdn.jsdelivr.net/npm/@finos/perspective-viewer-d3fc/dist/cdn/perspective-viewer-d3fc.js"></script>
    <link rel="stylesheet" crossorigin="anonymous" href="https://cdn.jsdelivr.net/npm/@finos/perspective-viewer/dist/css/pro.css"/>
    <style>
    perspective-viewer {
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    display: flex;
    flex-direction: column;
    }
    </style>
    </head>


    <body>
    <perspective-viewer id="viewer"></perspective-viewer>
    </body>


    <script type="module">
    import perspective from "https://cdn.jsdelivr.net/npm/@finos/perspective/dist/cdn/perspective.js";

    window.addEventListener("DOMContentLoaded", async function () {
    const websocket = await perspective.websocket("ws://localhost:8000/websocket");
    const worker = perspective.worker();
    await document.getElementById("viewer").load(websocket.open_table("test"));
    });
    </script>
    </html>
    30 changes: 30 additions & 0 deletions server.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,30 @@
    import asyncio
    import random
    from fastapi import FastAPI, WebSocket
    from perspective import Server
    from perspective.handlers.starlette import PerspectiveStarletteHandler
    from starlette.staticfiles import StaticFiles


    loop = asyncio.get_event_loop()
    app = FastAPI()
    perspective_server = Server()


    async def websocket_handler(websocket: WebSocket):
    await PerspectiveStarletteHandler(perspective_server=perspective_server, websocket=websocket).run()

    app.add_api_websocket_route("/websocket", websocket_handler)
    app.mount("/", StaticFiles(directory=".", html=True), name="static")

    async def feed(table):
    while True:
    table.update([{"a": random.randint(0, 10), "index": 1}])
    await asyncio.sleep(0.1)


    @app.on_event("startup")
    def startup():
    client = perspective_server.new_local_client(loop_callback=asyncio.get_event_loop().call_soon_threadsafe)
    table = client.table({"a": "integer", "index": "integer"}, index="index", name="test")
    loop.create_task(feed(table))