71 lines
2.1 KiB
Python
71 lines
2.1 KiB
Python
|
import asyncio
|
||
|
import json
|
||
|
import logging
|
||
|
import time
|
||
|
import os
|
||
|
from typing import Annotated
|
||
|
|
||
|
import uvicorn
|
||
|
from fastapi import FastAPI, Query, Request
|
||
|
from fastapi.responses import HTMLResponse, Response
|
||
|
from fastapi.staticfiles import StaticFiles
|
||
|
from fastapi.templating import Jinja2Templates
|
||
|
|
||
|
from cdf_parser import CdfParser
|
||
|
|
||
|
from render import Renderer
|
||
|
|
||
|
def handle_pdb(sig, frame):
|
||
|
import pdb
|
||
|
pdb.Pdb().set_trace(frame)
|
||
|
|
||
|
logging.basicConfig(level=logging.DEBUG)
|
||
|
|
||
|
app = FastAPI()
|
||
|
|
||
|
templates = Jinja2Templates(directory="templates")
|
||
|
|
||
|
renderer: Renderer = Renderer(debug=True, concurrent_workers=8, storage_state="894799196@qq.com.json")
|
||
|
@app.on_event(r"startup")
|
||
|
def startup():
|
||
|
# FIXME: This background task cannot catch an exception
|
||
|
asyncio.gather(renderer.run())
|
||
|
|
||
|
@app.get("/", response_class=Response)
|
||
|
async def render():
|
||
|
with open("web-2-J7IzVHyi0Zc.cdf", "rb") as f:
|
||
|
cdf = f.read()
|
||
|
rendered_page = await renderer.render_page(cdf)
|
||
|
if rendered_page is None:
|
||
|
return Response(status_code=500)
|
||
|
return Response(content=await renderer.render_page(cdf), media_type="image/png")
|
||
|
app.mount("/file", StaticFiles(directory="."), name="file")
|
||
|
|
||
|
@app.get("/file", response_class=HTMLResponse)
|
||
|
def list_files(request: Request):
|
||
|
files = os.listdir("./")
|
||
|
files_paths = sorted([f"/file/{f}" for f in files])
|
||
|
# print(files_paths)
|
||
|
return templates.TemplateResponse(
|
||
|
"list_files.html", {"request": request, "files": files_paths}
|
||
|
)
|
||
|
|
||
|
@app.get("/worker/{worker_id}")
|
||
|
async def get_worker(worker_id: int):
|
||
|
return Response(content=await renderer.worker_screenshot(worker_id), media_type="image/png")
|
||
|
|
||
|
@app.get("/worker_content/{worker_id}")
|
||
|
async def get_content(worker_id: int):
|
||
|
return Response(content=await renderer.worker_content(worker_id))
|
||
|
|
||
|
@app.post("/render")
|
||
|
async def render_cdf(cdf_dict: dict):
|
||
|
cdf = json.dumps(cdf_dict)
|
||
|
rendered_page = await renderer.render_page(cdf)
|
||
|
if rendered_page is None:
|
||
|
return Response(status_code=500)
|
||
|
return Response(content=rendered_page, media_type="image/png")
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
uvicorn.run("serve:app", host="0.0.0.0", port=8000, log_level="debug")
|