datasette-sitemap 作者:simonw

星标

README 源代码

datasette-sitemap

PyPI Changelog Tests License

为 Datasette 网站生成 sitemap.xml

安装

将此插件安装在与 Datasette 相同的环境中。

datasette install datasette-sitemap

演示

此插件用于 til.simonwillison.net 上的站点地图

这是用于该站点地图的配置

用法

配置后,此插件会在 /sitemap.xml 添加一个站点地图,其中包含 URL 列表。

此列表使用 metadata.json(或 .yml)中的 SQL 查询定义,如下所示:

{
  "plugins": {
    "datasette-sitemap": {
      "query": "select '/' || id as path from my_table"
    }
  }
}

使用 metadata.yml 允许使用多行 SQL 查询,这更容易维护

plugins:
  datasette-sitemap:
    query: |
      select
        '/' || id as path
      from
        my_table

SQL 查询必须返回一个名为 path 的列。此列中的值必须以 / 开头。它们将用于生成如下所示的站点地图:

https://example.com/1 https://example.com/2 ">
xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url><loc>https://example.com/1loc>url>
  <url><loc>https://example.com/2loc>url>
urlset>

您可以在 SQL 查询中使用 UNION 来组合来自多个表的结果,或包含您想要包含在索引中的字面路径

select
  '/data/table1/' || id as path
  from table1
union
select
  '/data/table2/' || id as path
  from table2
union
select
  '/about' as path

如果您的 Datasette 实例有多个数据库,您可以使用 database 配置属性来配置要查询的数据库。

默认情况下,站点地图中生成的 URL 的域名将从传入请求中检测。

您可以改为设置 base_url 来覆盖此设置。这不应包含末尾的斜杠。

此示例展示了这两个设置:针对 content 数据库运行查询并设置自定义基础 URL

plugins:
  datasette-sitemap:
    query: |
      select '/plugins/' || name as path from plugins
      union
      select '/tools/' || name as path from tools
      union
      select '/news' as path
    database: content
    base_url: https://datasette.com.cn

尝试该查询.

robots.txt

此插件添加一个指向站点地图的 robots.txt 文件

Sitemap: http://example.com/sitemap.xml

您可以通过安装和配置 datasette-block-robots 插件来完全控制站点地图。

即使您使用 datasette-block-robots 来处理其他 robots.txt 文件内容,此插件也会添加 Sitemap: 行。

从其他插件向站点地图添加路径

此插件向 Datasete 添加了一个新的插件钩子,名为 sitemap_extra_paths(),其他插件可以使用它来向 sitemap.xml 文件添加额外的行。

该钩子接受这些可选参数:

  • datasette:当前的 Datasette 实例。您可以使用它来执行 SQL 查询或读取插件配置设置。
  • request:表示对 /sitemap.xml 的传入请求的 请求对象

该钩子应返回一个字符串列表,每个字符串表示要添加到站点地图的路径。每个路径必须以 / 开头。

它也可以返回一个 async def 函数,该函数将被等待并用于生成行列表。如果您需要在钩子实现中进行 await 调用,请使用此选项。

此示例使用该钩子添加了两个额外的路径,其中一个来自 SQL 查询

from datasette import hookimpl

@hookimpl
def sitemap_extra_paths(datasette):
    async def inner():
        db = datasette.get_database()
        path_from_db = (await db.execute("select '/example'")).single_value()
        return ["/about", path_from_db]
    return inner

开发

要本地设置此插件,首先签出代码。然后创建一个新的虚拟环境:

cd datasette-sitemap
python3 -m venv venv
source venv/bin/activate

现在安装依赖和测试依赖:

pip install -e '.[test]'

运行测试:

pytest