Skip to content

Commit

Permalink
Add docs for ASGI web apps
Browse files Browse the repository at this point in the history
  • Loading branch information
oeway committed May 7, 2024
1 parent 1be67a1 commit 0e6ed74
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 0 deletions.
1 change: 1 addition & 0 deletions docs/_sidebar.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
* [Getting Started](/getting-started)
* [ImJoy RPC V2](/imjoy-rpc)
* [Serverless Functions](/serverless-functions)
* [Serve ASGI Web Apps](/asgi-apps)
* [Development](/development)
61 changes: 61 additions & 0 deletions docs/asgi-apps.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
## Serve ASGI Web Applications

ASGI is a standard to create async web applications. With hypha, you can register a service which serves an ASGI application, e.g. a FastAPI app which serve a web page, or a web API.

The following example shows how to use FastAPI to create a web application in the browser, e.g. https://imjoy-notebook.netlify.app/, and serve it through Hypha.

```python
import asyncio
from imjoy_rpc.hypha import connect_to_server

import micropip

# This assumes you are in a Pyodide environment
await micropip.install(["fastapi==0.70.0", "pyotritonclient==0.1.37", "numpy", "imageio", "Pillow", "matplotlib"])

from fastapi import FastAPI
from fastapi.responses import HTMLResponse

# Connect to the Hypha server
server_url = "https://ai.imjoy.io"
server = await connect_to_server({"server_url": server_url})

app = FastAPI()

@app.get("/", response_class=HTMLResponse)
async def root():
html_content = """
<html>
<head>
<title>Cat</title>
</head>
<body>
<img src="https://cataas.com/cat?type=square" alt="cat">
</body>
</html>
"""
return HTMLResponse(content=html_content, status_code=200)

@app.get("/api/v1/test")
async def test():
return {"message": "Hello, it works!", "server_url": server_url}

async def serve_fastapi(args):
scope = args["scope"]
print(f'{scope["client"]} - {scope["method"]} - {scope["path"]}')
await app(args["scope"], args["receive"], args["send"])

svc_info = await server.register_service({
"id": "cellpose",
"name": "cellpose",
"type": "ASGI",
"serve": serve_fastapi,
"config":{
"visibility": "public"
}
})

print(f"Test it with the HTTP proxy: {server_url}/{server.config.workspace}/apps/{svc_info['id'].split(':')[1]}")
```

This will create a web page which you can view in the browser, and also an API endpoint at `/api/v1/test`.

0 comments on commit 0e6ed74

Please sign in to comment.