【问题标题】:Get Flask to show image not located in the static directory获取 Flask 以显示不在静态目录中的图像
【发布时间】:2013-08-21 21:30:59
【问题描述】:

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

我的模板看起来像:

{% 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>

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

达雷尔

【问题讨论】:

    标签: python templates flask jinja2


    【解决方案1】:

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

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

    【讨论】:

    • 如果我使用您的建议,例如: 它确实显示在浏览器中。
    • it does show in the browser - 没关系,但是当您尝试从http(s):// 访问file:// 时可能会出现安全问题。
    • 我创建了一个指向烧瓶静态目录的符号链接。它现在适用于您的建议。
    【解决方案2】:

    这是我的项目path。我写了一个简单的函数,可以让它在网页上呈现。我不能 100% 确定它是否会在部署后工作,所以我会更新它是否在部署后工作。

     <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 模板,如下所示:

    return render_template("/contentpage.html",image_url=imgurl)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-04
      • 2021-02-12
      • 2013-02-09
      相关资源
      最近更新 更多