File size: 1,454 Bytes
079a804 511a6d9 a310d13 079a804 a310d13 079a804 a310d13 079a804 a310d13 079a804 a310d13 079a804 b87b24a |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
from fastapi import FastAPI, Request, Form
from fastapi.responses import HTMLResponse
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates
import sys
import io
import json
app = FastAPI()
app.mount("/static", StaticFiles(directory="static"), name="static")
templates = Jinja2Templates(directory="templates")
def run_code_with_trace(code: str):
trace_data = []
stdout_capture = io.StringIO()
def tracer(frame, event, arg):
if event == "line":
trace_data.append({
"line": frame.f_lineno,
"locals": frame.f_locals.copy()
})
return tracer
sys.settrace(tracer)
try:
exec(code, {})
except Exception as e:
trace_data.append({"error": str(e)})
finally:
sys.settrace(None)
output = stdout_capture.getvalue()
stdout_capture.close()
return trace_data, output
@app.get("/", response_class=HTMLResponse)
async def index(request: Request):
return templates.TemplateResponse("index.html", {"request": request})
@app.post("/run", response_class=HTMLResponse)
async def run_code(request: Request, code: str = Form(...)):
trace, output = run_code_with_trace(code)
return templates.TemplateResponse(
"index.html",
{
"request": request,
"trace_json": json.dumps(trace),
"output": output,
"code": code
}
)
|