Gradio 月活用户破百万之旅!

阅读更多
Gradio logo
  1. 附加功能
  2. 文件访问

安全和文件访问

与他人分享你的 Gradio 应用(通过在 Spaces 上托管,在你自己的服务器上,或通过临时分享链接)会将你机器上的某些文件暴露在互联网上。暴露的文件可以通过一个特殊的 URL 访问

http://<your-gradio-app-url>/gradio_api/file=<local-file-path>

本指南解释了哪些文件会被暴露,以及确保你机器上的文件安全的最佳实践。

Gradio 允许用户访问的文件

  • 1. 静态文件。你可以使用 gr.set_static_paths 函数指定静态文件或目录。静态文件不会被复制到 Gradio 缓存(见下文),并将直接从你的计算机提供。这可以帮助节省磁盘空间并减少你的应用启动所需的时间,但请注意可能的安全隐患,因为任何静态文件都可供你的 Gradio 应用的所有用户访问。

  • 2. `launch()` 中 `allowed_paths` 参数中的文件。此参数允许你传入一个额外的目录或确切文件路径列表,你希望允许用户访问。(默认情况下,此参数是一个空列表)。

  • 3. Gradio 缓存中的文件。在你启动 Gradio 应用后,Gradio 会将某些文件复制到一个临时缓存中,并使这些文件可供用户访问。让我们在下面更详细地解释这一点。

Gradio 缓存

首先,重要的是要理解为什么 Gradio 需要缓存。Gradio 在将文件返回到前端之前,会将文件复制到缓存目录。这可以防止文件在一个用户仍然需要时被你的应用程序的另一个用户覆盖。例如,如果你的预测函数返回一个视频文件,那么 Gradio 将在你的预测函数运行并返回前端可以用来显示视频的 URL 后,将该视频移动到缓存中。缓存中的任何文件都可以通过 URL 供你正在运行的应用程序的所有用户访问。

提示: 你可以通过将 `GRADIO_TEMP_DIR` 环境变量设置为绝对路径(例如 `/home/usr/scripts/project/temp/`)来自定义缓存的位置。

Gradio 移动到缓存的文件

Gradio 将三种类型的文件移动到缓存中

  1. 开发者在运行时之前指定的文件,例如,缓存的示例、组件的默认值,或传递给参数的文件,例如 `gr.Chatbot` 的 `avatar_images`

  2. Gradio 应用程序中预测函数返回的文件路径,如果它们也满足以下条件之一

  • 它在 `Blocks.launch` 方法的 `allowed_paths` 参数中。
  • 它在 python 解释器的当前工作目录中。
  • 它在由 `tempfile.gettempdir()` 获取的临时目录中。

注意:当前工作目录中名称以句点 (`.`) 开头的文件不会被移动到缓存中,即使它们是从预测函数返回的,因为它们通常包含敏感信息。

如果不满足这些标准中的任何一个,则返回该文件的预测函数将引发异常,而不是将文件移动到缓存。Gradio 执行此检查是为了防止你机器上的任意文件被访问。

  1. 用户上传到你的 Gradio 应用的文件(例如,通过 `File` 或 `Image` 输入组件)。

    提示: 如果 Gradio 在任何时候阻止了你想要处理的文件,请将其路径添加到 `allowed_paths` 参数。

Gradio 不允许他人访问的文件

在运行时,Gradio 应用将不允许用户访问

  • 你通过 `launch()` 中的 `blocked_paths` 参数显式阻止的文件。你可以将额外的目录或确切的文件路径列表传递给 `launch()` 中的 `blocked_paths` 参数。此参数优先于 Gradio 默认暴露的文件,或通过 `allowed_paths` 参数或 `gr.set_static_paths` 函数暴露的文件。

  • 主机上的任何其他路径。用户不应该能够访问主机上的其他任意路径。

上传文件

分享您的 Gradio 应用程序也将允许用户上传文件到您的电脑或服务器。您可以设置文件上传的最大文件大小,以防止滥用并节省磁盘空间。您可以使用 .launchmax_file_size 参数来完成此操作。例如,以下两个代码片段将文件上传限制为每个文件 5 兆字节。

import gradio as gr

demo = gr.Interface(lambda x: x, "image", "image")

demo.launch(max_file_size="5mb")
# or
demo.launch(max_file_size=5 * gr.FileSize.MB)

最佳实践

  • 为您的应用程序设置 max_file_size
  • 不要从连接到基于文件的输出组件(gr.Imagegr.File 等)的函数中返回任意用户输入。例如,以下界面将允许任何人将本地目录中的任意文件移动到缓存:gr.Interface(lambda s: s, "text", "file")。 这是因为用户输入被视为任意文件路径。
  • 使 allowed_paths 尽可能小。如果 allowed_paths 中的路径是一个目录,则可以访问该目录中的任何文件。确保 allowed_paths 的条目仅包含与您的应用程序相关的文件。
  • 从应用程序文件所在的同一目录运行您的 Gradio 应用程序。这将缩小 Gradio 允许移动到缓存中的文件范围。例如,优先选择 python app.py 而不是 python Users/sources/project/app.py

示例:访问本地文件

gr.set_static_paths 和 launch 中的 allowed_paths 参数都需要绝对路径。以下是一个在 HTML 代码块中显示本地 .png 图像文件的最小示例。

├── assets
│   └── logo.png
└── app.py

对于示例目录结构,可以从 app.py 中的 Gradio 应用程序访问 logo.pngassets 文件夹中的任何其他文件,如下所示:

from pathlib import Path

import gradio as gr

gr.set_static_paths(paths=[Path.cwd().absolute()/"assets"]])

with gr.Blocks() as demo:
    gr.HTML("<img src='/gradio_api/file=assets/logo.png'>")

demo.launch()