Repository navigation
Expand file tree
/
Copy pathapp.py
More file actions
57 lines (48 loc) · 1.65 KB
/
Copy pathapp.py
File metadata and controls
57 lines (48 loc) · 1.65 KB
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
54
55
56
57
from flask import Flask, request, jsonify
import io
import contextlib
app = Flask(__name__)
# --- Salud del servicio ---
@app.route("/", methods=["GET"])
def home():
return "Servidor Python ACTIVO"
# --- Diagnóstico: ver exactamente qué recibe el servidor ---
@app.route("/echo", methods=["POST"])
def echo():
return jsonify({
"method": request.method,
"content_type": request.content_type,
"json": (request.get_json(silent=True) or {}),
"form": request.form.to_dict()
})
# --- Ejecutar código Python ---
@app.route("/ejecutar", methods=["POST"])
def ejecutar():
"""
Acepta:
- JSON: {"codigo": "print(2+2)"}
- form-urlencoded: codigo=print(2+2)
Devuelve:
- {"resultado": "...salida capturada..."}
"""
# 1) Intentamos JSON
data = request.get_json(silent=True) or {}
# 2) Si no vino JSON, probamos form-urlencoded
if not data:
data = request.form.to_dict() if request.form else {}
codigo = (data.get("codigo") or "").strip()
# Si llega vacío, no bloqueamos: imprimimos "OK" (útil para detectar timeouts)
if not codigo:
codigo = "print('OK')"
buf = io.StringIO()
try:
with contextlib.redirect_stdout(buf):
# ¡OJO! Esto ejecuta código arbitrario. Úsalo solo en entornos controlados.
exec(codigo, {})
return jsonify({"resultado": buf.getvalue()})
except Exception as e:
return jsonify({"resultado": f"Error: {e}"})
# --- Arranque local (no se usa en Render con gunicorn) ---
if __name__ == "__main__":
# Ejecuta en local: python app.py
app.run(host="127.0.0.1", port=8000, debug=True)