各种子文件夹中的烧瓶图像

Flask Images in Various Subfolders

我有一个简单的 Flask 网络应用程序,它为每个用户存储小型 PDF/JPEG。由于文件对每个用户都是唯一的,我不想像 flask 要求的那样简单地将它们存储在“静态”文件夹中。相反,我有一个“用户”文件夹,其中为每个用户创建了一个子文件夹并存储了他们的文件。

我希望能够进行以下操作,但是图片不显示:

{% block main %}
   <img src="/users/bob/test.JPG"
{% endblock %}

但是,如果我将相同的 test.JPG 保存在静态中并使用以下内容,它确实有效:

{% block main %}
   <img src="/static/test.JPG"
{% endblock %}

我的文件结构是:

ProjectFolder
   static
      styles.css
   templates
      index.html
      ...
   users
      bob
         image.jpg
         ...
      sam
      ...
   venv
   app.py
   helpers.py

Flask默认只支持从static文件夹下载静态文件
但是,如果您添加自己的端点,则可以从您选择的文件夹下载文件。出于安全原因,您应该确保对文件系统的某些区域的访问受到限制。为此,我还建议使用 instance path 的子目录。因此,这些文件与您的应用程序是分开的。

import os
from flask import Flask 
from flask import send_from_directory

app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = os.path.join(app.instance_path, 'users')

try:
    os.makedirs(app.config['UPLOAD_FOLDER'])
except OSError:
    pass

@app.route('/users/<path:filename>')
def download(filename):
    return send_from_directory(
        app.config['UPLOAD_FOLDER'], 
        filename
    )

要请求其中一个文件,您可以使用 url_for 或直接指定路径。

<img src="{{ url_for('.download', filename='bob/image.jpg') }}" />