获取Flask以显示不在静态目录中的图像

时间:2013-08-21 21:31:00

标签: python templates flask jinja2

我正在尝试显示位于不是默认静态文件夹的文件夹中的图像。

我的模板如下:

{% extends "layout.html" %}
{% block body %}
   Albums
   {% for album in albums %}
      <img src="{{ album ['ThumbPath'] }}">
   {% endfor %}
{% endblock %}

生成的HTML如下所示:

<!doctype html>
<title>iPhoto</title>
<link rel=stylesheet type=text/css href="/static/style.css">
<div class=page>
<h1>iPhoto</h1>  
<img src="/Users/Darrell/Pictures/iPhoto Library/Thumbnails/2013/08/09/20130809-180444/t264vvMaQM+GJosBP+4q+Q/_DSC1225.jpg">  
<img src="/Users/Darrell/Pictures/iPhoto Library/Thumbnails/2013/08/09/20130809-181030/urU3jqSKRgGNNP1MjKhpvg/_DSC1268.jpg">
<img src="/Users/Darrell/Pictures/iPhoto Library/Thumbnails/2013/08/09/20130809-181037/1zYyNYReRg+Sizx8v4BUkw/_DSC0923.jpg">  
<img src="/Users/Darrell/Pictures/iPhoto Library/Thumbnails/2013/08/09/20130809-181038/sKzEEB3jSf6GBs2heQIviA/Kelly.jpg">
</div>

如何在生成的网页上呈现图像。 图像的路径是正确的。 无法将所有图像复制到静态文件夹。

达雷尔

2 个答案:

答案 0 :(得分:4)

看起来你有文件系统路径而不是站点。使用/启动资源时,路径将从站点根目录开始(站点的绝对路径,不带斜杠或./../是相对的),例如,如果您有站点{{1然后http://test.com将是/http://test.com/将是/test。您可以为其他网站设置特定协议http://test.com/test的路径或当前网站protocol://的相同路径。您总是可以在浏览器错误控制台中找到错误(完整)网址的错误。

要访问文件系统,您必须使用//协议,您的网址将与file://类似。但它只适用于您的计算机,并且可能存在安全问题。您还可以将此文件的符号链接设置为静态文件夹,这样可以解决安全问题,但不能解决仅计算机的问题。要完全解决此问题,请更好地将此文件发布到您的应用程序或公共(私有)Web服务器上以获取图像或其他静态文件。

答案 1 :(得分:1)

这是我的项目path。我编写了一个简单的函数,该函数可以通过使其在网页上呈现而起作用。我不确定百分百部署后是否能正常工作,因此我将对其进行更新。

 <img alt="" src="{{ url_for('send_file', filename=image_url) }}" id ="img"/>

这是HTML元素的代码,这是服务器端Python中相应的代码。

def getImageName(x):
    """
    Dealing with Unix Path names and Windows PathNames
    """
    if platform.system() == 'Linux':
        return  x[x.rfind("/")+1:]
    return x[x.rfind("\\")+1: ]
      
def getFolder(x):
        y = []
        if platform.system() == 'Linux':
            y = x.split("/")
        else:
            y = x.split("\\")
       # print(y)
        cat_name = ""
        if "roomImage" in x:
            cat_name+="roomImage/" + y[-2]
        elif "lobbyImage" in x:
            cat_name+="lobbyImage"
        elif "miscImage" in x:
            cat_name += "miscImage/" + y[-2]
        elif "washroomImage" in x:
            cat_name += "washroomImage"
        else:
            cat_name += "facadeImage"
        return cat_name + "/"

@app.route("/send_file/<filename>")
def send_file(filename):
   return send_from_directory(app.config["UPLOAD_FOLDER"] +"/" + getFolder(filename) , getImageName(filename))

这在大多数情况下都有效。 顺便说一句,image_url应该是图像的绝对路径,您可以将其作为参数通过render_template传递给Jinja2模板,如下所示:

返回render_template(“ / contentpage.html”,image_url = imgurl)

不要忘记导入send_from_directory并将app.config [“ UPLOAD_FOLDER”]设置到适当的目录。这不是最有效的方法