【问题标题】:How to properly server static files from a Flask server?如何从 Flask 服务器正确地提供静态文件?
【发布时间】:2020-07-21 08:12:05
【问题描述】:

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

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

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

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

我想解决这个问题的方法本质上是创建一个/file/&lt;path:filepath&gt; 路由,其中​​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/ 目录中。

除了希望有人遇到相同的问题/问题并找到解决方法之外,恐怕我在这里无能为力。

这是文件夹树:

├── [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:添加树

【问题讨论】:

  • @Patch 我正在运行本地环境。在样板环境中,我创建了一个 server 文件夹,该文件夹是 routes 文件夹、models 文件夹、public 文件夹和 app.py 本身的主页。
  • 由于app.pypublic 文件夹共享同一个父文件夹,应该没有问题吧?

标签: flask static-files


【解决方案1】:

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

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'

希望这就是你要问的。

【讨论】:

    猜你喜欢
    • 2013-09-27
    • 2020-02-21
    • 2021-09-07
    • 1970-01-01
    • 2023-03-06
    • 2015-11-03
    相关资源
    最近更新 更多