rabiyulfahim commited on
Commit
0944f07
·
verified ·
1 Parent(s): 4417b33

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +21 -2
app.py CHANGED
@@ -7,37 +7,56 @@ import io
7
  import json
8
 
9
  app = FastAPI()
 
 
10
  app.mount("/static", StaticFiles(directory="static"), name="static")
11
  templates = Jinja2Templates(directory="templates")
12
 
 
13
  def run_code_with_trace(code: str):
14
  trace_data = []
15
  stdout_capture = io.StringIO()
16
 
 
 
 
 
 
 
 
 
 
17
  def tracer(frame, event, arg):
18
  if event == "line":
 
19
  trace_data.append({
20
  "line": frame.f_lineno,
21
- "locals": frame.f_locals.copy()
22
  })
23
  return tracer
24
 
 
25
  sys.settrace(tracer)
 
26
  try:
27
- exec(code, {})
 
28
  except Exception as e:
29
  trace_data.append({"error": str(e)})
30
  finally:
31
  sys.settrace(None)
 
32
 
33
  output = stdout_capture.getvalue()
34
  stdout_capture.close()
35
  return trace_data, output
36
 
 
37
  @app.get("/", response_class=HTMLResponse)
38
  async def index(request: Request):
39
  return templates.TemplateResponse("index.html", {"request": request})
40
 
 
41
  @app.post("/run", response_class=HTMLResponse)
42
  async def run_code(request: Request, code: str = Form(...)):
43
  trace, output = run_code_with_trace(code)
 
7
  import json
8
 
9
  app = FastAPI()
10
+
11
+ # Mount static files (for CSS, JS)
12
  app.mount("/static", StaticFiles(directory="static"), name="static")
13
  templates = Jinja2Templates(directory="templates")
14
 
15
+
16
  def run_code_with_trace(code: str):
17
  trace_data = []
18
  stdout_capture = io.StringIO()
19
 
20
+ # ✅ Safely serialize objects (avoid JSON TypeError)
21
+ def safe_serialize(obj):
22
+ try:
23
+ json.dumps(obj)
24
+ return obj
25
+ except (TypeError, OverflowError):
26
+ return str(obj)
27
+
28
+ # ✅ Tracer function
29
  def tracer(frame, event, arg):
30
  if event == "line":
31
+ locals_serialized = {k: safe_serialize(v) for k, v in frame.f_locals.items()}
32
  trace_data.append({
33
  "line": frame.f_lineno,
34
+ "locals": locals_serialized
35
  })
36
  return tracer
37
 
38
+ # Redirect stdout temporarily (if user uses print)
39
  sys.settrace(tracer)
40
+ sys.stdout = stdout_capture
41
  try:
42
+ safe_globals = {"__builtins__": {"print": print, "range": range, "len": len}}
43
+ exec(code, safe_globals)
44
  except Exception as e:
45
  trace_data.append({"error": str(e)})
46
  finally:
47
  sys.settrace(None)
48
+ sys.stdout = sys.__stdout__ # reset stdout
49
 
50
  output = stdout_capture.getvalue()
51
  stdout_capture.close()
52
  return trace_data, output
53
 
54
+
55
  @app.get("/", response_class=HTMLResponse)
56
  async def index(request: Request):
57
  return templates.TemplateResponse("index.html", {"request": request})
58
 
59
+
60
  @app.post("/run", response_class=HTMLResponse)
61
  async def run_code(request: Request, code: str = Form(...)):
62
  trace, output = run_code_with_trace(code)