Solución:
El método preferido es usar nginx u otro servidor web para servir archivos estáticos; podrán hacerlo de manera más eficiente que Flask.
Sin embargo, puede utilizar send_from_directory
para enviar archivos desde un directorio, lo que puede ser bastante conveniente en algunas situaciones:
from flask import Flask, request, send_from_directory
# set the project root directory as the static folder, you can set others.
app = Flask(__name__, static_url_path="")
@app.route('/js/<path:path>')
def send_js(path):
return send_from_directory('js', path)
if __name__ == "__main__":
app.run()
Hacer no usar send_file
o send_static_file
con una ruta proporcionada por el usuario.
send_static_file
ejemplo:
from flask import Flask, request
# set the project root directory as the static folder, you can set others.
app = Flask(__name__, static_url_path="")
@app.route("https://foroayuda.es/")
def root():
return app.send_static_file('index.html')
Si solo desea mover la ubicación de sus archivos estáticos, entonces el método más simple es declarar las rutas en el constructor. En el siguiente ejemplo, moví mis plantillas y archivos estáticos a una subcarpeta llamada web
.
app = Flask(__name__,
static_url_path="",
static_folder="web/static",
template_folder="web/templates")
-
static_url_path=""
elimina cualquier ruta anterior de la URL (es decir, la ruta predeterminada/static
). -
static_folder="web/static"
para servir los archivos que se encuentran en la carpeta
web/static
como archivos estáticos. -
template_folder="web/templates"
de manera similar, esto cambia la carpeta de plantillas.
Con este método, la siguiente URL devolverá un archivo CSS:
<link rel="stylesheet" type="text/css" href="https://foroayuda.es/css/bootstrap.min.css">
Y finalmente, aquí hay una instantánea de la estructura de carpetas, donde flask_server.py
es la instancia de Flask:
También puede, y este es mi favorito, configurar una carpeta como ruta estática para que todos los archivos puedan acceder a ellos.
app = Flask(__name__, static_url_path="/static")
Con ese conjunto, puede usar el HTML estándar:
<link rel="stylesheet" type="text/css" href="https://foroayuda.es/static/style.css">