我已使用以下代码在我的 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
。我想以某种方式返回带有简单链接的文件。
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')}}
在 Starlette 0.24.0(2023 年 2 月)中更新,StaticFiles() 有一个新参数 follow_symlink=True 来支持符号链接。