Где фляжка ищет файлы изображений?

Я настраиваю локальный сервер, используя флягу. Все, что я хочу сделать в настоящее время, - это отображение изображения с помощью тега img на странице index.html. Но я продолжаю получать ошибку

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

Где фляжка ищет файлы? Маленькая помощь была бы большой. Мой HTML-код

<html>
  <head>

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

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

  </body>

</html>

Мой код python:

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

Ответ 1

Является ли файл образа ayrton_senna_movie_wallpaper_by_bashgfx-d4cm6x6.jpg в вашем static каталоге? Если вы переместите его в свой статический каталог и обновите свой HTML как таковой:

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

Он должен работать.

Кроме того, стоит отметить, что есть лучший способ структурировать это.

Структура файла:

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 __name__ == '__main__':
    app.run()

Шаблоны /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>

Выполнение этого способа гарантирует, что вы не жестко кодируете URL-адрес для ваших статических активов.

Ответ 2

используйте абсолютный путь, где изображение действительно существует (например) '/home/artitra/pictures/filename.jpg'

или создать статическую папку внутри каталога проекта, например

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

тогда сделайте это

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

то вы можете получить доступ к своему изображению, как это в index.html

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

в теге img

Ответ 3

Из документации:

Для динамических веб-приложений также требуются статические файлы. Обычно используется CSS и JavaScript файлы. В идеале ваш веб-сервер настроен для обслуживания их для вас, но во время разработки Flask может это сделать. Просто создайте папку с именем static в вашем пакете или рядом с вашим модулем, и она будет доступна в /static в приложении.

Чтобы создавать URL-адреса для статических файлов, используйте специальное 'static' имя конечной точки:

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

Файл должен быть сохранен в файловой системе как static/style.css.

Ответ 4

Мне понадобилось время, чтобы понять это. url_for в Flask ищет конечные точки, которые вы указали в скрипте routes.py.

Так что если у вас есть декоратор в файле routes.py например @blah.route('/folder.subfolder') тогда Flask будет распознавать команду {{ url_for('folder.subfolder'), filename = "some_image.jpg" }}. 'folder.subfolder' отправляет его в конечную точку Flask, которую он распознает.

Однако скажем, что вы сохранили свой файл изображения some_image.jpg в своей some_image.jpg, но не указали эту подпапку в качестве конечной точки маршрута в вашей routes.py, ваш декоратор маршрутов выглядит как @blah.routes('/folder'). Затем вы должны запросить свой файл изображения следующим образом: {{ url_for('folder'), filename = 'subfolder/some_image.jpg' }}

IE вы указываете Flask, чтобы перейти к конечной точке, которую он знает, "папке", а затем направьте ее туда, поместив путь подкаталога в аргумент filename.