FastAPI 通过符号链接提供静态文件

问题描述 投票:0回答:2

我已使用以下代码在我的 FastAPI 应用程序中安装了静态目录:

from fastapi.staticfiles import StaticFiles

app = FastAPI(
    title="Title of the Application",
    description="Over all description of the application")
app.mount("/public", StaticFiles(directory='public'), name='public')

如果我有一个符号链接指向应用程序文件夹之外的路径,例如

/home/xyz/app/main.py
/home/xyz/app/index.html
/home/xyz/app/public/data -> /home/xyz/static/whatever.tgz

FastAPI 应用程序可以识别 URL

xyz.com/public/index.html
,但无法识别
xyz.com/public/data

这可行吗?不幸的是,由于

FileResponse
尺寸太大,我无法使用
blob
。我想以某种方式返回带有简单链接的文件。

python fastapi static-files
2个回答
1
投票

这是可行的,只要您也在该特定路径上挂载一个

StaticFiles
实例即可。例如:

app.mount("/public", StaticFiles(directory="public"), name="public")
app.mount("/publicsym", StaticFiles(directory="public/data"), name="publicsym")

然后在 Jinja2 模板中,您可以请求以下文件:

<link href="{{ url_for('public', path='/styles.css') }}" rel="stylesheet">
<img src="{{ url_for('publicsym', path='/image.png')}}" width="50%">

或者,根据您给定的示例(如果有一个

"static"
目录,其中包含“whatever.tgz”文件):

{{ url_for('publicsym', path='static/whatever.tgz')}}

0
投票

在 Starlette 0.24.0(2023 年 2 月)中更新,StaticFiles() 有一个新参数 follow_symlink=True 来支持符号链接。

© www.soinside.com 2019 - 2024. All rights reserved.