No se pueden recuperar archivos de send_from_directory () en el matraz

Tengo un archivo html que hace referencia a objetos estáticos como este

  

Por lo tanto, el navegador intenta llamar a esta vía y el matraz no lo hace.

 http://127.0.0.1:5000/https://stackoverflow.com/questions/17681762/unable-to-retrieve-files-from-send-from-directory-in-flask/img/snacks.png 

Existen muchas referencias de este tipo en varios archivos, por lo que no es posible cambiar las referencias. ¿Cómo sirvo estos archivos estáticos de FLASK?

He copiado todos estos archivos estáticos a la carpeta ‘estática’ y he intentado esto

 @app.route('/') def send_file(filename): return send_from_directory('/static', filename) 

Sin embargo, esto no funciona, ¿Hay alguna otra manera de hacer esto? o que estoy haciendo mal?

En producción, no desea servir archivos estáticos utilizando el servidor de matraz. Le sugiero que use un servidor web adecuado para hacer eso.

Para dev, ya que no desea utilizar url_for , puede intentar inicializar su aplicación de matraz como se muestra a continuación. De esta manera, flask sabe dónde están tus archivos estáticos.

 app = Flask(__name__, static_folder='static') @app.route('/') def send_file(filename): return send_from_directory(app.static_folder, filename) 

Vea esta publicación con mucha información Archivos estáticos en Flask – robot.txt, sitemap.xml (mod_wsgi)

Si observa la documentación de send_from_directory verá que toma la ruta al directorio en el que se guardan los archivos en el disco . A menos que tenga sus archivos de imagen guardados en un directorio de nivel raíz llamado static , querrá actualizar su ruta de archivo:

 send_from_directory("/some/path/to/static", "my_image_file.jpg") 

Dicho esto, si está utilizando esto para cualquier cosa que esté bajo carga, es mejor asegurarse de que su servidor web sirva los archivos, en lugar de los archivos estáticos de su aplicación.

Creo que una mejor manera de hacer esto sería:

 import flask # ... @app.route('/img/') def legacy_images(fname): return flask.redirect(flask.url_for('static', filename='img/' + fname), code=301) 

En lugar de enviar los archivos en dos ubicaciones diferentes, esto haría una redirección permanente a la URL correcta. Como han dicho otros, también es una buena idea servir archivos estáticos directamente con nginx o Apache.

No use el servidor incorporado de Flask en producción. Es solo para desarrollo! Y no use Flask para servir activos estáticos. ¡Es lento! En producción, use un servidor web delante de Flask como apache2, nginx o lighttpd. Estos servidores pueden reescribir una URL y servir activos estáticos.

Cómo implementar Flask: http://flask.pocoo.org/docs/deploying/

Cómo reescribir una URL: apache2 , nginx , lighttpd .