Skip to content

静态文件

Starlette 还包括一个用于在给定目录中提供文件服务的 StaticFiles 类:

静态文件

签名: StaticFiles(directory=None, packages=None, html=False, check_dir=True, follow_symlink=False)

  • directory - 表示目录路径的字符串或 os.PathLike。
  • packages - 一个 Python 包的字符串列表或字符串元组列表。
  • html - 以 HTML 模式运行。如果存在此类文件,会为目录自动加载 index.html
  • check_dir - 确保在实例化时该目录存在。默认为 True
  • follow_symlink - 一个布尔值,表示是否应遵循文件和目录的符号链接。默认为 False

您可以将此 ASGI 应用程序与 Starlette 的路由相结合,以提供全面的静态文件服务。

from starlette.applications import Starlette
from starlette.routing import Mount
from starlette.staticfiles import StaticFiles


routes = [
    ...
    Mount('/static', app=StaticFiles(directory='static'), name="static"),
]

app = Starlette(routes=routes)

对于不匹配的请求,静态文件将以“404 未找到”或“405 方法不允许”响应。在 HTML 模式下,如果 404.html 文件存在,它将作为 404 响应显示。

packages 选项可用于包含 Python 包内的“静态”目录。Python 的“bootstrap4”包就是一个这样的例子。

from starlette.applications import Starlette
from starlette.routing import Mount
from starlette.staticfiles import StaticFiles


routes=[
    ...
    Mount('/static', app=StaticFiles(directory='static', packages=['bootstrap4']), name="static"),
]

app = Starlette(routes=routes)

默认情况下, StaticFiles 会在每个包中查找 statics 目录,您可以通过指定一个字符串元组来更改默认目录。

routes=[
    ...
    Mount('/static', app=StaticFiles(packages=[('bootstrap4', 'static')]), name="static"),
]

您可能更愿意将静态文件直接包含在“static”目录内,而不是使用 Python 打包来包含静态文件,但这对于捆绑可复用组件可能是有用的。