web-dev-qa-db-fra.com

Impossible de récupérer les fichiers de send_from_directory () dans un flacon

J'ai un fichier html qui référence un objet statique comme celui-ci 

<img src="img/snacks.png">
<link href="css/bluestrap.css" rel="stylesheet">

Par conséquent, le navigateur essaie d’appeler cela via et le flacon ne parvient pas à le faire. 

http://127.0.0.1:5000/img/snacks.png  

Il existe de nombreuses références de ce type dans plusieurs fichiers, ce qui rend leur modification impossible. Comment puis-je servir ces fichiers statiques à partir de FLASK 

J'ai copié tous ces fichiers statiques dans le dossier 'static' et j'ai essayé 

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

Cependant, cela ne fonctionne pas, existe-t-il un autre moyen de le faire? ou qu'est-ce que je fais mal? 

12
Rijul Jain

En production, vous ne souhaitez pas gérer les fichiers statiques à l'aide du serveur de flacon. Je vous suggère d'utiliser un serveur Web approprié pour le faire.

Pour dev, puisque vous ne voulez pas utiliser url_for, vous pouvez essayer d’initialiser votre application de flacon comme ci-dessous. De cette façon, flask sait où se trouvent vos fichiers statiques. 

app = Flask(__name__, static_folder='static')  

@app.route('/<path:filename>')  
def send_file(filename):  
    return send_from_directory(app.static_folder, filename)

Voir ce message avec beaucoup d’informations Fichiers statiques dans Flask - robot.txt, sitemap.xml (mod_wsgi)

18
codegeek

Si vous regardez la documentation pour send_from_directory , vous verrez qu’elle prend le chemin du répertoire dans lequel les fichiers sont conservés sur le disque . Sauf si vos fichiers image sont enregistrés dans un répertoire de niveau racine nommé static, vous souhaiterez mettre à jour votre chemin de fichier:

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

Cela dit, si vous utilisez ceci pour tout ce qui sera chargé, il est préférable de s’assurer que votre web server sert les fichiers plutôt que de servir des fichiers statiques à partir de votre application.

4
Sean Vieira

Je pense qu'une meilleure façon de faire cela serait:

import flask

# ...

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

Au lieu d'envoyer les fichiers sur deux emplacements différents, cela ferait une redirection permanente vers l'URL appropriée. Comme d'autres l'ont déjà dit, il est également judicieux de servir des fichiers statiques directement avec nginx ou Apache.

2

N'utilisez pas le serveur intégré de Flask en production. C'est pour le développement seulement! Et n'utilisez pas Flask pour servir des actifs statiques. C'est lent! En production, utilisez un serveur Web en face de Flask, comme Apache2, nginx ou lighttpd. Ces serveurs peuvent réécrire une URL et servir des actifs statiques.

Comment déployer Flask: http://flask.pocoo.org/docs/deploying/

Comment réécrire une URL: Apache2 , nginx , lighttpd .

1
dAnjou