Cómo servir archivos estáticos en Flask

| | | | | | | | | | | | | | | | | | | | |

Así que esto es vergonzoso. Tengo una aplicación que armé en Flask y por ahora solo está mostrando una única página HTML estática con algunos enlaces a CSS y JS. Y no puedo encontrar dónde en la documentación Flask describe la devolución de archivos estáticos. Sí, podría usar render_template pero sé que los datos no tienen plantillas. Pensé que send_file o url_for era lo correcto, pero no pude hacer que funcionaran. Mientras tanto, abro los archivos, leo el contenido y armar una Response con el tipo mime apropiado:

importar os.path desde el matraz import Flask, Response app = Flask(__name__) app.config.from_object(__name__) def root_dir(): # pragma: no cover return os.path.abspath(os.path.dirname(__file__)) def get_file(filename): # pragma: no cover try: src = os.path.join(root_dir(), filename) # Averigüe cómo el matraz devuelve archivos estáticos # Probado: # - render_template # - send_file # Esto no debería ser tan no obvio return open(src).read() excepto IOError as exc: return str(exc) @app. route("/", method=["GET"]) def metrics(): # pragma: no cover content = get_file("jenkins_analytics.html") return Response(content, mimetype="text/html") @app .route("/", defaults={"path": ""}) @app.route("/<path:path>") def get_resource(path): # pragma: no cover mimetypes = { ".css": "text/css", ".html": "text/html", ".js": "aplicación/javascript", } complete_path = os.path. join(root_dir(), ruta) ext = os.path.splitext(ruta)[1] mimetype = mimetypes.get(ext, "text/html") contenido = get_file(ruta_completa) return Response(contenido, mimetype=mimetype ) if __name__ == "__main__": # pragma: no cover app.run(port=80) 

¿Alguien quiere dar una muestra de código o URL para esto? Sé que esto va a ser muy simple.