【问题标题】:FastApi serving static files through symlinksFastApi 通过符号链接提供静态文件
【发布时间】:2022-01-10 12:49:31
【问题描述】:

我已使用以下代码在我的 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

这可行吗?不幸的是,由于 blob 太大,我无法使用 FileResponse。我想以某种方式返回带有简单链接的文件。

【问题讨论】:

    标签: python fastapi static-files


    【解决方案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%">
    

    或者,根据您给定的示例(如果在指向文件夹中有一个“静态”目录,包括一个“whatever.tgz”文件):

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

    【讨论】:

    • 您发布的内容很有效,谢谢。是否有可能以某种方式即时生成符号链接然后挂载它们?这个选项有一个小的安全漏洞,任何知道链接的人都可以访问文件。
    • 那……烦人。有没有办法强制它选择这些路径或将第二个路径定义为 ("public/data", StaticFiles(...))
    • ^ 更新,这确实有效。只需在根路径之前定义嵌套/更深的路径。先安装那些。
    猜你喜欢
    • 2020-10-08
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 2011-01-16
    • 2015-03-18
    • 2019-02-22
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多