web-dev-qa-db-fra.com

Où flask) cherche-t-il des fichiers image?

Je suis en train de mettre en place un serveur local en utilisant flask. Tout ce que je veux faire actuellement, c'est afficher une image à l'aide de la balise img dans la page index.html. Mais je continue à obtenir erreur

GET http://localhost:5000/
ayrton_senna_movie_wallpaper_by_bashgfx-d4cm6x6.jpg 404 (NOT FOUND)  

Où flask cherche-t-il des fichiers? Un petit coup de pouce serait bien. Mon code HTML est

<html>
  <head>

  </head>
  <body>
    <h1>Hi Lionel Messi</h1>

  <img src= "ayrton_senna_movie_wallpaper_by_bashgfx-d4cm6x6.jpg ">

  </body>

</html>

Mon code python est:

@app.route('/index', methods=['GET', 'POST'])
def lionel(): 
    return app.send_static_file('index.html')
42
Aritra Biswas

Le fichier image ayrton_senna_movie_wallpaper_by_bashgfx-d4cm6x6.jpg est-il dans votre répertoire static? Si vous le déplacez dans votre répertoire statique et mettez à jour votre code HTML en tant que tel:

<img src="/static/ayrton_senna_movie_wallpaper_by_bashgfx-d4cm6x6.jpg">

Ça devrait marcher.

Il convient également de noter qu’il existe un meilleur moyen de structurer cela.

Structure du fichier:

app.py
static
   |----ayrton_senna_movie_wallpaper_by_bashgfx-d4cm6x6.jpg
templates
   |----index.html

app.py

from flask import Flask, render_template, url_for
app = Flask(__name__)

@app.route('/index', methods=['GET', 'POST'])
def lionel(): 
    return render_template('index.html')

if __== '__main__':
    app.run()

templates/index.html

<html>
  <head>

  </head>
  <body>
    <h1>Hi Lionel Messi</h1>

  <img src="{{url_for('static', filename='ayrton_senna_movie_wallpaper_by_bashgfx-d4cm6x6.jpg')}}" />

  </body>

</html>

En procédant ainsi, vous éviterez de coder en dur un chemin d’URL pour vos actifs statiques.

53
Matt Healy

utiliser le chemin absolu où l'image existe réellement (par exemple) '/home/artitra/pictures/filename.jpg'

ou créez un dossier statique dans votre répertoire de projet comme ceci

| templates
   - static/
         - images/
              - yourimagename.jpg

alors fais ceci

app = Flask(__name__, static_url_path='/static')

alors vous pouvez accéder à votre image comme ceci dans index.html

src ="/static/images/yourimage.jpg" 

dans img tag

17
Balaji

De la documentation :

Les applications Web dynamiques ont également besoin de fichiers statiques. C’est d’habitude l’origine des fichiers CSS et JavaScript. Idéalement, votre serveur Web est configuré pour les servir à votre place, mais pendant le développement Flask peut également le faire. Créez simplement un dossier appelé static dans votre paquet ou à côté de votre module. et il sera disponible à /static sur l'application.

Pour générer des URL pour des fichiers statiques, utilisez la commande spéciale 'static' nom du noeud final:

url_for('static', filename='style.css')

Le fichier doit être stocké sur le système de fichiers en tant que static/style.css.

7
Burhan Khalid

Il m'a fallu un certain temps pour comprendre cela aussi. url_for In Flask recherche les points de terminaison que vous avez spécifiés dans le script routes.py.

Donc, si vous avez un décorateur dans votre fichier routes.py Comme @blah.route('/folder.subfolder') alors Flask reconnaîtra la commande {{ url_for('folder.subfolder') , filename = "some_image.jpg" }}.]. Le 'folder.subfolder' L'argument l'envoie à un Flask endpoint qu'il reconnaît.

Cependant, disons que vous avez stocké votre fichier image, some_image.jpg, Dans votre sous-dossier, MAIS n’a pas spécifié ce sous-dossier en tant que point de terminaison de la route dans votre flask routes.py , votre décorateur de route ressemble à @blah.routes('/folder'). Vous devez ensuite demander votre fichier image de la manière suivante: {{ url_for('folder'), filename = 'subfolder/some_image.jpg' }}

C'EST À DIRE. vous dites à Flask d'aller au noeud final qu'il connaît, "dossier", puis dirigez-le à partir de là en plaçant le chemin du sous-répertoire dans l'argument du nom de fichier.

3
pelon