插件

Datasette 的插件系统允许将附加功能实现为 Python 代码(或前端 JavaScript),这些功能可以打包在单独的 Python 包中。底层机制使用 pluggy

请参阅 Datasette 插件目录 获取现有插件列表,或查看 GitHub 上的 datasette-plugin 主题。

您可以使用插件做的事情包括

安装插件

如果插件已使用 setuptools 打包分发,您可以通过将其与 Datasette 一起安装在同一虚拟环境或 Docker 容器中使用该插件。

您可以使用 datasette install 命令安装插件

datasette install datasette-vega

您可以使用 datasette uninstall 卸载插件

datasette uninstall datasette-vega

您可以使用 datasette install --upgradedatasette install -U 升级插件

datasette install -U datasette-vega

此命令也可用于将 Datasette 本身升级到最新发布的版本

datasette install -U datasette

这些命令是 pip installpip uninstall 的简单封装,可确保它们在与 Datasette 本身相同的虚拟环境中运行 pip

使用 --plugins-dir 的一次性插件

您还可以通过将一次性项目插件保存为 plugins/ 文件夹中的 plugin_name.py 函数,然后使用 --plugins-dir 选项将该文件夹传递给 datasette 来定义它们

datasette mydb.db --plugins-dir=plugins/

使用 datasette publish 部署插件

datasette publish 和 datasette package 命令都接受一个可选的 --install 参数。您可以多次使用此参数来告诉 Datasette 在过程中 pip install 指定的插件

datasette publish cloudrun mydb.db --install=datasette-vega

您可以使用 PyPI 上的包名称或 pip install 的任何其他有效参数,例如 .zip 文件的 URL

datasette publish cloudrun mydb.db \
    --install=https://url-to-my-package.zip

查看已安装的插件

您可以通过导航到您的 Datasette 实例的 /-/plugins 页面来查看已安装插件的列表 - 例如:https://fivethirtyeight.datasettes.com/-/plugins

您也可以使用 datasette plugins 命令

$ datasette plugins
[
    {
        "name": "datasette_json_html",
        "static": false,
        "templates": false,
        "version": "0.4.0"
    }
]

如果您运行 datasette plugins --all,它将包含作为 Datasette 一部分提供的默认插件

[
    {
        "name": "datasette.actor_auth_cookie",
        "static": false,
        "templates": false,
        "version": null,
        "hooks": [
            "actor_from_request"
        ]
    },
    {
        "name": "datasette.blob_renderer",
        "static": false,
        "templates": false,
        "version": null,
        "hooks": [
            "register_output_renderer"
        ]
    },
    {
        "name": "datasette.default_magic_parameters",
        "static": false,
        "templates": false,
        "version": null,
        "hooks": [
            "register_magic_parameters"
        ]
    },
    {
        "name": "datasette.default_menu_links",
        "static": false,
        "templates": false,
        "version": null,
        "hooks": [
            "menu_links"
        ]
    },
    {
        "name": "datasette.default_permissions",
        "static": false,
        "templates": false,
        "version": null,
        "hooks": [
            "permission_allowed"
        ]
    },
    {
        "name": "datasette.facets",
        "static": false,
        "templates": false,
        "version": null,
        "hooks": [
            "register_facet_classes"
        ]
    },
    {
        "name": "datasette.filters",
        "static": false,
        "templates": false,
        "version": null,
        "hooks": [
            "filters_from_request"
        ]
    },
    {
        "name": "datasette.forbidden",
        "static": false,
        "templates": false,
        "version": null,
        "hooks": [
            "forbidden"
        ]
    },
    {
        "name": "datasette.handle_exception",
        "static": false,
        "templates": false,
        "version": null,
        "hooks": [
            "handle_exception"
        ]
    },
    {
        "name": "datasette.publish.cloudrun",
        "static": false,
        "templates": false,
        "version": null,
        "hooks": [
            "publish_subcommand"
        ]
    },
    {
        "name": "datasette.publish.heroku",
        "static": false,
        "templates": false,
        "version": null,
        "hooks": [
            "publish_subcommand"
        ]
    },
    {
        "name": "datasette.sql_functions",
        "static": false,
        "templates": false,
        "version": null,
        "hooks": [
            "prepare_connection"
        ]
    }
]

您可以添加 --plugins-dir= 选项以包含在该目录中找到的任何插件。

插件配置

插件可以拥有自己的配置,嵌入在 元数据 文件中。插件的配置选项位于该文件中的 "plugins" 键下,可以包含在根、数据库或表级别。

这里是针对特定表的一些插件配置示例

{
    "databases": {
        "sf-trees": {
            "tables": {
                "Street_Tree_List": {
                    "plugins": {
                        "datasette-cluster-map": {
                            "latitude_column": "lat",
                            "longitude_column": "lng"
                        }
                    }
                }
            }
        }
    }
}

这会告诉 datasette-cluster-map 插件对于名为 sf-trees.db 的数据库文件中的名为 Street_Tree_List 的表,应使用哪个纬度和经度列。

秘密配置值

嵌入在 metadata.json 中的任何值对于查看您的 Datasette 实例的 /-/metadata 页面的任何人都是可见的。某些插件可能需要保密的配置 - 例如 API 密钥。您可以通过两种方式存储秘密配置值。

作为环境变量。如果您的秘密位于 Datasette 进程可访问的环境变量中,您可以像这样指示应从该环境变量读取配置值

{
    "plugins": {
        "datasette-auth-github": {
            "client_secret": {
                "$env": "GITHUB_CLIENT_SECRET"
            }
        }
    }
}

作为单独文件中的值。您的秘密也可以存储在磁盘上的文件中。要指定应从文件读取秘密,请提供完整文件路径,如下所示

{
    "plugins": {
        "datasette-auth-github": {
            "client_secret": {
                "$file": "/secrets/client-secret"
            }
        }
    }
}

如果您使用 datasette publish 系列命令发布数据,您可以使用 --plugin-secret 选项在发布时设置这些秘密。例如,使用 Heroku,您可能会运行以下命令

$ datasette publish heroku my_database.db \
    --name my-heroku-app-demo \
    --install=datasette-auth-github \
    --plugin-secret datasette-auth-github client_id your_client_id \
    --plugin-secret datasette-auth-github client_secret your_client_secret

这将设置必要的环境变量并将以下内容添加到已部署的 metadata.json

{
    "plugins": {
        "datasette-auth-github": {
            "client_id": {
                "$env": "DATASETTE_AUTH_GITHUB_CLIENT_ID"
            },
            "client_secret": {
                "$env": "DATASETTE_AUTH_GITHUB_CLIENT_SECRET"
            }
        }
    }
}