diff --git a/Aplicacion/app.py b/Aplicacion/app.py
new file mode 100644
index 0000000000000000000000000000000000000000..6901fe8b9ed90ac3cd9ad69388141ddf195490aa
--- /dev/null
+++ b/Aplicacion/app.py
@@ -0,0 +1,141 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#Flask
+from flask import Flask, render_template, request, json, session, send_file
+
+#Gunicorn.
+import multiprocessing
+import gunicorn.app.base
+
+#generacion de clave aleatoria
+import random
+import string
+
+#Otros
+import os #para borrar las imagenes despues de usarlas
+import traceback    #Para poder impirmir el error.
+from werkzeug.utils import secure_filename  #Para leer nombres de ficheros
+import shutil
+import threading
+
+#modelo de prediccion
+from predict import *
+
+
+app = Flask(__name__)
+#generacion de clave aleatoria con 10 simbolos
+app.config['SECRET_KEY']= ''.join(random.SystemRandom().choice(string.ascii_uppercase + string.digits)  for _ in range(10))
+lock = threading.Lock() #Creamos el candado para los hilos
+
+
+modelo = None
+clasePred = None
+im = None
+
+
+@app.route("/", methods=['POST','GET'])    #Indicamos el tipo de forma para las peticiones, get o post.
+def controlador():
+    try:
+        print("Peticion recibida")
+        if request.method=='POST':
+            if 'tipo' in request.form:
+                _tipo=request.form['tipo']
+            else:
+                _tipo=None
+        else:
+            _tipo=request.args.get('tipo')
+        if _tipo=="imagen":
+            return procesarImagen(request)
+        elif _tipo=="resultado":
+            return mostrarResultado()
+        else:
+            #Para borrar las imagenes que estaban almacenadas de otras predicciones
+            dir1="./static/ImagenesGuardadas"
+            dir2="./static/GRADCAM_img"
+            for f in os.listdir(dir1):
+            	os.remove(os.path.join(dir1,f))
+            for f in os.listdir(dir2):
+            	os.remove(os.path.join(dir2,f))
+            return render_template("principal.html")
+    except Exception as e:
+        traceback.print_exc(e)
+        return e
+
+
+def procesarImagen( request):
+    
+    global modelo
+    global clasePred
+    global im
+ 
+    if modelo is None:
+    	modelo = ModeloCovid()
+ 
+    f = request.files['miFichero']     #Se obtiene el fichero
+    setImagen(secure_filename(f.filename)) #secure_filename te lo guarda con el mismo nombre de fichero
+    f.save('./static/ImagenesGuardadas/'+getImagen()) #se guarda
+    f.close #se cierra el fichero
+    
+    lock.acquire() #bloqueamos el hilo
+    #Se obtienen la prediccion(indice 0) y las probalidades(por si se necesitan) en output
+    output = modelo.predict("./static/ImagenesGuardadas/"+getImagen())
+    setPred(output[0])
+    #se obtiene el heatmap y la imagen y se guarda la imagen
+    heatmap, grad_image = modelo.gradCam("./static/ImagenesGuardadas/"+getImagen(),
+    					cam_path="./static/GRADCAM_img/cam"+getImagen())
+    lock.release() #desbloqueamos el hilo
+    return json.dumps({}), 200 #peticion de respuesta al servidor
+
+def mostrarResultado():
+    return render_template("resultado.html", clase=getPred(), foto="./static/GRADCAM_img/cam"+getImagen())
+    
+######## modelo de datos #####################
+def getImagen():
+    global im
+    return im
+
+def setImagen(imagen):
+    global im
+    im = imagen
+
+def getPred():
+    global clasePred
+    return clasePred
+
+def setPred(pred):
+    global clasePred
+    clasePred = pred
+
+#####################     Gunicorn      #####################
+
+def number_of_workers():
+    return (multiprocessing.cpu_count() * 2) + 1
+
+
+class StandaloneApplication(gunicorn.app.base.BaseApplication):
+
+    def __init__(self, app, options=None):
+        self.options = options or {}
+        self.application = app
+        super(StandaloneApplication, self).__init__()
+
+    def load_config(self):
+        config = dict([(key, value) for key, value in self.options.items()
+                       if key in self.cfg.settings and value is not None])
+        #for key, value in iteritems(config):
+        for key, value in config.items():
+            self.cfg.set(key.lower(), value)
+
+    def load(self):
+        return self.application
+###########################################################
+
+if __name__ == '__main__':
+    options = {
+        'bind': '%s:%s' % ('0.0.0.0', '5000'),
+        'workers': 1,
+        'threads': number_of_workers(),
+        'reload': True
+    }
+    StandaloneApplication(app, options).run()
+