烧瓶在哪里寻找图像文件?

Ari*_*was 46 python file-upload web-development-server flask

我正在使用flask设置本地服务器.我目前要做的就是使用index.html页面中的img标签显示图像.但我不断收到错误

GET http://localhost:5000/
ayrton_senna_movie_wallpaper_by_bashgfx-d4cm6x6.jpg 404 (NOT FOUND)  
Run Code Online (Sandbox Code Playgroud)

烧瓶在哪里寻找文件?一点帮助都会很棒.我的HTML代码是

<html>
  <head>

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

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

  </body>

</html>
Run Code Online (Sandbox Code Playgroud)

我的python代码是:

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

Mat*_*aly 57

您的static目录中的图像文件是ayrton_senna_movie_wallpaper_by_bashgfx-d4cm6x6.jpg 吗?如果将其移动到静态目录并更新HTML,请执行以下操作:

<img src="/static/ayrton_senna_movie_wallpaper_by_bashgfx-d4cm6x6.jpg">
Run Code Online (Sandbox Code Playgroud)

它应该工作.

此外,值得注意的是,有一种更好的方法来构建它.

文件结构:

app.py
static
   |----ayrton_senna_movie_wallpaper_by_bashgfx-d4cm6x6.jpg
templates
   |----index.html
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

模板/ 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>
Run Code Online (Sandbox Code Playgroud)

这样做可以确保您不会对静态资产的URL路径进行硬编码.

  • @弗兰克是的,就像平常一样将图像居中。使用 url_for 不会改变这里的任何内容 (2认同)

小智 18

使用图像实际存在的绝对路径(例如)'/ home /artitra/pictures/filename.jpg'

或者像这样在项目目录中创建静态文件夹

| templates
   - static/
         - images/
              - yourimagename.jpg
Run Code Online (Sandbox Code Playgroud)

然后这样做

app = Flask(__name__, static_url_path='/static')
Run Code Online (Sandbox Code Playgroud)

然后你可以在index.html中像这样访问你的图像

src ="/static/images/yourimage.jpg" 
Run Code Online (Sandbox Code Playgroud)

在img标签


小智 9

我也花了一段时间才弄清楚这一点。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在您的子文件夹中,但没有将此子文件夹指定为您的烧瓶中的路由端点routes.py,您的路由装饰器看起来像@blah.routes('/folder'). 然后,您必须以这种方式请求您的图像文件: {{ url_for('folder'), filename = 'subfolder/some_image.jpg' }}

IE 你告诉 Flask 去它知道的端点,“文件夹”,然后通过将子目录路径放在文件名参数中来引导它。


Bur*_*lid 7

文档:

动态Web应用程序还需要静态文件.这通常是CSS和JavaScript文件的来源.理想情况下,您的Web服务器已配置为为您提供服务,但在开发期间,Flask也可以这样做.只需创建一个static在包中或模块旁边调用的文件夹,它就可以在/static应用程序中找到.

要为静态文件生成URL,请使用特殊'static'端点名称:

url_for('static', filename='style.css')
Run Code Online (Sandbox Code Playgroud)

该文件必须存储在文件系统中static/style.css.