如何从 Flask 服务器正确地服务器静态文件?

How to properly server static files from a Flask server?

从 Flask 服务器提供静态文件(图像、PDF、文档等)的正确方法是什么?

我以前用过send_from_directory方法,效果很好。这是我的实现:

@app.route('/public/assignments/<path:filename>')
def file(filename):
    return send_from_directory("./public/assignments/", filename, as_attachment=True)

但是,如果我有多个不同的文件夹,它可能会变得有点忙乱和重复,因为您实际上是在为不同的文件位置编写相同的代码 - 这意味着如果我想为用户而不是任务显示文件,我必须将其更改为 /public/users/<path:filename> 而不是 /public/assignments/<path:filename>.

我想解决这个问题的方法本质上是制作一条 /file/<path:filepath> 路线,其中 filepath 是目标文件夹的完整路径 + 文件名和扩展名,而不仅仅是文件名称和扩展名。然后我做了一些格式化并将父目录与文件本身分开,并在调用 send_from_directory 函数时使用该数据:

@app.route('/file/<path:filepath>', methods=["GET"])
def general_static_files(filepath):
    filepath = filepath.split("/")
    _dir = ""
    for i, p in enumerate(filepath):
        if i < len(filepath) - 1:
            _dir = _dir + (p + "/")
    return send_from_directory(("./" + _dir), filepath[len(filepath) - 1], as_attachment=True)

如果我们模拟以下请求到这条路由:

curl http://127.0.0.1:5000/file/public/files/jobs/images/job_43_image_1.jpg

_dir 变量将保存 ./public/files/jobs/images/ 值,然后 filepath[len(filepath) - 1] 保存 job_43_image_1.jpg 值。

如果我点击这条路线,我会得到一个 404 - Not Found 响应,但路线主体中的所有代码都在执行。

我怀疑 send_from_directory 函数是我得到 404 - Not Found 的原因。但是,我确实将图像 job_43_image_1.jpg 存储在 /public/files/jobs/images/ 目录中。

恐怕我在这里能做的不多,只能希望有人遇到了同样的问题 issue/problem 并找到了修复它的方法。

这是文件夹树:

├── [2050]  app.py
├── [2050]  public
│   ├── [2050]  etc
│   └── [2050]  files
│       ├── [2050]  jobs
│       │   ├── [2050]  files
│       │   └── [2050]  images
│       │       ├── [2050]  job_41_image_decline_1.jpg
│       │       ├── [2050]  job_41_image_decline_2554.jpg
│       │       ├── [2050]  ...
│       ├── [2050]  shop
│       └── [2050]  videos
└── [2050]  server_crash.log

编辑 1:我已经设置了 static_url_path。我没有理由相信这可能是我的问题的原因。

编辑 2:添加了树

初始化应用程序时传递这些参数:

app = Flask(__name__, static_folder='public',
                      static_url_path='frontend_public' )

这将使文件 public/blah.txthttp://example.com/frontend_public/blah.txt 可用。

  • static_folder 设置文件系统上的文件夹
  • static_url_path 设置 URL
  • 中使用的路径

如果两个变量都没有设置,则两者都默认为 'static'

希望这就是您要问的。