HOWTO · Python
Ejecuta Python en HTML
Aprenda a ejecutar Python en HTML
En esta página
El navegador no ejecuta Python en el servidor solo porque se incluya un script en HTML estático. Para mostrar contenido generado con Python, ejecútalo en un servidor y devuelve el resultado en la respuesta HTTP. Una aplicación PHP puede iniciar un proceso de Python para una integración pequeña; en una aplicación Django, lo habitual es pasar los datos de una vista a una plantilla.
Ejecutar scripts de Python en HTML con PHP
Guarda la página con una extensión que PHP procese, como .php, y sírvela desde un servidor PHP configurado. El servidor también necesita un intérprete de Python y permiso para iniciarlo. Este ejemplo autónomo crea un script breve de Python, le pasa dos argumentos de forma segura e incluye el resultado capturado en la respuesta:
<?php
$pythonScript = <<<'PY'
import sys
name = sys.argv[1]
count = int(sys.argv[2])
print(f"Hello, {name}! Count: {count}")
PY;
$scriptPath = tempnam(sys_get_temp_dir(), 'page-python-');
file_put_contents($scriptPath, $pythonScript);
$command = 'python3 ' . escapeshellarg($scriptPath)
. ' ' . escapeshellarg('Mina')
. ' ' . escapeshellarg('3');
$result = shell_exec($command);
unlink($scriptPath);
?><!doctype html>
<html lang="en">
<body>
<p><?= htmlspecialchars($result ?? '', ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ?></p>
</body>
</html>
Aquí, PHP inicia python3; el proceso de Python recibe Mina y 3 como sys.argv[1] y sys.argv[2]. shell_exec() captura la salida del proceso y htmlspecialchars() la codifica antes de insertarla en la página. Ese contenido forma parte de la respuesta que se envía al navegador; no es texto que se imprima en la consola del servidor.
El proveedor de PHP debe tener habilitado shell_exec(), y la cuenta del servidor web debe poder ejecutar el intérprete. El ejemplo usa argumentos fijos. Si los valores son dinámicos, valídalos y escapa cada argumento por separado con escapeshellarg(); nunca concatenes datos no confiables en un comando de shell. En aplicaciones más grandes, una cola de tareas o un servicio dedicado pueden ser más adecuados que iniciar un proceso en cada solicitud.
Ejecutar un script de Python en HTML con Django
En una aplicación Django, coloca la lógica de la aplicación en vistas de Python y pasa su resultado a una plantilla. La plantilla inserta ese valor en el HTML en el servidor; el navegador recibe la página ya renderizada y no ejecuta Python. Por ejemplo, una vista puede preparar context = {"message": "Hello from Django"} y devolver render(request, "page.html", context), mientras la plantilla muestra el valor con {{ message }}.
Una etiqueta de plantilla personalizada resulta útil cuando quieres reutilizar lógica de presentación en las plantillas. En una aplicación instalada llamada core, crea core/templatetags/__init__.py y core/templatetags/my_custom_tags.py. En este último archivo, importa template desde django, asigna register = template.Library() y define una función decorada con @register.simple_tag, por ejemplo, def greeting(): return "Hello from Django". Después de añadir el paquete templatetags, reinicia el servidor de desarrollo para que Django lo detecte.
En una plantilla, carga el módulo con {% load my_custom_tags %} y llama a la etiqueta con {% greeting %}. La etiqueta devuelve texto para que la plantilla lo renderice en el servidor; no ejecuta Python arbitrario en el HTML del navegador. Para valores sencillos, suele ser más claro usar una vista y el contexto de una plantilla que crear una etiqueta personalizada. Django también incluye filtros como date, linebreaks, safe y random; consulta la referencia de filtros integrados para plantillas de Django.
Si la página necesita datos después de cargarse, expón una vista de Django como endpoint y solicítalos con fetch() u otro cliente AJAX. Comprueba la autenticación y la autorización antes de devolver datos sensibles o realizar una acción. Para las solicitudes POST que modifican el estado, usa la protección CSRF de Django y envía el token CSRF. Limitar un endpoint al método POST no basta para protegerlo. Consulta la documentación de CSRF de Django.
Elige la invocación de un proceso PHP para integrar un script de Python existente y pequeño en un sitio alojado con PHP, siempre que el servidor lo permita. En una aplicación Django, las vistas y las plantillas suelen ser la forma habitual de calcular y renderizar los datos de una página; usa una etiqueta personalizada para reutilizar la presentación en plantillas y un endpoint para los datos que se solicitan después de cargar la página.