Frasco, sigue recibiendo 404 archivos estáticos de servicio usando send_static_file

Seguí las instrucciones de Cómo servir archivos estáticos en Flask , pero todavía no pude hacerlo funcionar.

Aquí está mi estructura de proyecto:

Project_path | +--app | | | +--main.py +--static | +--js | +--jquery-1.11.2.min.js 

Aquí está main.py :

 @app.route('/js/') def serve_static(path): root_dir = os.path.dirname(os.getcwd()) print(os.path.join(root_dir, 'static', 'js', path)) return app.send_static_file(os.path.join(root_dir, 'static', 'js', path)) 

Aquí está index.html :

  ...  ... 

Y cuando visito / , pude ver la ruta correcta del archivo javascript impreso en la pantalla
que es Project_path/static/js/jquery-1.11.2.min.js .

Pero aún así, tengo

 127.0.0.1 - - [22/Dec/2014 11:26:30] "GET /js/jquery-1.11.2.min.js HTTP/1.1" 404 - 

Cualquier ayuda es apreciada.

EDITAR
Después de pasar por el método send_static_file , descubro qué está pasando. Básicamente, no debería usar abspath como argumento, el matraz tiene un juicio en send_static_file :

 if os.path.isabs(filename) or \ filename == '..' or \ filename.startswith('../'): raise NotFound() 

Y como el filename que pasé es un abspath, el matraz levanta NotFound() .
Parece que lo que se supone que se debe pasar es una ruta relativa a self.static_folder (self es ), que, en mi proyecto, es Project_name/app/static . Sin embargo, no configuré static_folder que significa que el matraz cree que la carpeta estática debería estar allí.

Todavía estoy tratando de averiguar qué hacer.

Finalmente lo puse en funcionamiento. utilizar flask.send_from_directory

 from flask import send_from_directory @app.route('/js/') def serve_static(filename): root_dir = os.path.dirname(os.getcwd()) return send_from_directory(os.path.join(root_dir, 'static', 'js'), filename) 

Ahora me queda claro que el matraz realmente odia a las personas que ponen app.py o, en mi caso, main.py en un subdirectorio. Utilice send_static_file solo si su carpeta estática es lo que el flask cree que es, es decir, una carpeta con el nombre static en el mismo directorio con app.py.

Todo lo que necesita hacer es pasar el parámetro static_url_path al iniciador:

static_url_path : se puede utilizar para especificar una ruta diferente para los archivos estáticos en la web. Por defecto es el nombre de la carpeta static_folder .

static_folder : la carpeta con archivos estáticos que se debe servir en static_url_path. El valor predeterminado es la carpeta ‘estática’ en la ruta raíz de la aplicación.

 app = Flask(__name__, static_folder=os.path.abspath('/foo/bar/zoo/')) 

Ahora, flask buscará un directorio llamado static en /foo/bar/zoo desde donde se sirven los archivos estáticos. Solo usa send_from_directory si está sirviendo archivos de medios que pueden no estar en la misma ubicación que los archivos estáticos.

Olvidó agregar 'static' en el último os.path.join en la cláusula return .

para mi este funciono

 @app.route('/static/') def serve_static(filename): root_dir = os.path.dirname(os.getcwd()) return send_from_directory(os.path.join(root_dir, 'static', 'js'), filename) 

al lado de agregar este script en init

 app._static_folder = os.path.abspath("static/") app = Flask(__name__) 

en __init__.py

usted necesita eliminar –

 if __name__ == "__main__": app.run() 

Luego vuelve a agregarlo desde tu main.py Eso lo arregló para mí!

o compruebe su archivo apache a veces el directorio no es correcto allí!