指南:站点级默认值

SEO_SUITE["DEFAULTS"] 和 SEO_SUITE["SITE_DEFAULTS"] 这两个设置构成一层元数据基线,所有页面都会继承。优先级更高的提供者(模型字段、视图、路径规则)会逐字段覆盖它们。


全局默认值

在 settings.py 中添加 SEO_SUITE。你设置的每个键都会与内置默认值深度合并,因此只需写出想要改动的部分:

SEO_SUITE = {
    "DEFAULTS": {
        "title_suffix": " | My Blog",
        "robots": "index,follow",
        "og": {
            "type": "website",
            "site_name": "My Blog",
        },
    },
}

内置的全局默认值(未被覆盖时生效):

字段 内置值
title_suffix ""(无后缀)
robots "index,follow"
og.type "website"

CANONICAL_DOMAIN 与 HTTPS

默认情况下,canonical URL 根据请求的 Host 头生成。若要无论请求来自何处都强制使用某个域名,设置 CANONICAL_DOMAIN:

SEO_SUITE = {
    "CANONICAL_DOMAIN": "www.example.com",
    "FORCE_HTTPS_CANONICAL": True,  # default: True
}

设置了 CANONICAL_DOMAIN 之后,所有 canonical URL 都使用 https://www.example.com,即使在本地开发环境中,或位于未正确传递 Host 头的反向代理之后,也是如此。

FORCE_HTTPS_CANONICAL 会把所有 http:// 的 canonical URL 升级为 https://,即使没有设置 CANONICAL_DOMAIN 也同样生效。


按站点设置默认值(多站点项目)

安装了 django.contrib.sites(或设置了 SITE_ID)时,可以为每个站点提供不同的默认值:

SEO_SUITE = {
    "DEFAULTS": {
        "title_suffix": " | My Network",
        "og": {"site_name": "My Network"},
    },
    "SITE_DEFAULTS": {
        1: {
            "title_suffix": " | My Blog",
            "og": {"site_name": "My Blog"},
        },
        2: {
            "title_suffix": " | My Shop",
            "og": {"site_name": "My Shop"},
        },
    },
}

站点专属配置块(优先级 20)按同样的逐字段逻辑合并到全局默认值(优先级 10)之上。还可以在 SITE_DEFAULTS 中用 None 作为键,为所有没有专属条目的站点提供默认值:

"SITE_DEFAULTS": {
    None: {"robots": "noindex"},   # applies when no site-specific match
    1:    {"robots": "index,follow"},
},

站点 ID 的解析方式

当前站点 ID 按以下回退链依次确定:

  1. SEO_SUITE["SITE_ID_RESOLVER"]:一个可调用对象,接收 request 并返回整数站点 ID。需要自定义逻辑(子域名路由、按请求头选择等)时用它。
  2. django.contrib.sites.shortcuts.get_current_site(request):在安装了 django.contrib.sites 时使用。
  3. settings.SITE_ID:在已定义时使用。
  4. None:单站点,不应用任何按站点的默认值。

自定义解析器示例:

# myapp/utils.py

def my_site_id_resolver(request):
    if request.get_host().startswith("shop."):
        return 2
    return 1
# settings.py
SEO_SUITE = {
    "SITE_ID_RESOLVER": "myapp.utils.my_site_id_resolver",
}

DEFAULT_SCHEMA_PROFILES

为全站每个页面添加 JSON-LD schema profile:

SEO_SUITE = {
    "DEFAULT_SCHEMA_PROFILES": ["WebSite", "Organization"],
}

这些 profile 在全局默认值层(优先级 10)运行。按模型和按视图定义的 profile 会与它们一起累加。JSON-LD 块永远不会被更高优先级的层替换。


缓存解析后的元数据

对于高流量站点,可以启用解析结果缓存。缓存键按对象区分(模型 + 主键 + 代数计数器),因此保存和删除时会自动使过期值失效:

SEO_SUITE = {
    "CACHE_TTL": 300,           # seconds; 0 = disabled (default)
    "CACHE_BACKEND": "default", # any Django cache alias
    "CACHE_KEY_PREFIX": "seosuite:v1",
}

只有对象身份稳定(带主键的模型实例)的解析结果才会被缓存。列表页和不绑定模型的视图不在此处缓存。