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

时间:2020-07-21 08:12:05

标签: flask static-files

从Flask服务器提供静态文件(图像,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/<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/目录中。

除非希望有人遇到相同的问题/问题并找到解决问题的方法,否则我在这里看不到其他事情可以做。

这是文件夹树:

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

1 个答案:

答案 0 :(得分:0)

在初始化应用程序时传递以下参数:

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'

希望这是您的要求。