django-seo-suite

一个轻量、可扩展的 Django SEO 元数据层。用统一的方式为页面附加并渲染所需的 SEO 属性(<title>、<h1>、meta description、keywords、robots、canonical URL、hreflang 备选链接、JSON-LD 结构化数据,以及 Open Graph / Twitter 卡片),同时覆盖模型、基于类的视图,以及你无法修改的第三方模型。


它解决的问题

典型的 Django 项目会把 SEO 元数据散落在各种难以维护的地方:基础模板里的硬编码字符串、互不一致的 {% block title %} 覆盖、临时添加却与 rel="canonical" 渐渐脱节的 og:* 标签,以及在各个视图之间复制粘贴的 JSON-LD 代码块。当某个页面渲染出错误的标题,或者爬取审计报告 canonical 不匹配时,往往没有一个统一的地方可以排查。

django-seo-suite 就提供了这样一个统一的地方。每个页面都通过一个多提供者解析器解析自己的元数据,解析器按照文档约定、可预期的优先级顺序,合并来自全局默认值、按站点的默认值、可在后台编辑的 URL 规则、模型字段以及视图属性的各项贡献。最后由一个模板标签渲染结果。


核心能力

能力 实现方式
标题、h1、meta 标签、robots 模型约定,或显式的视图/模型属性
Canonical URL 来自 get_absolute_url 或显式指定;通过请求或配置的域名转为绝对地址
Open Graph + Twitter 卡片 从页面元数据自动填充;可完全覆盖
JSON-LD 结构化数据 在模型和视图上声明式定义 schema 配置
hreflang 备选链接 build_hreflang_alternates 配合 Django 的 translate_url
站点地图 SeoSitemap 保证 <loc> 与 canonical 一致
带版本管理的 robots.txt 历史记录存于数据库;可在后台激活/回滚
按 URL 在后台编辑的覆盖项 seo_suite.contrib.seopath
针对第三方模型在后台编辑的覆盖项 seo_suite.contrib.seoobject

设计原则

最小侵入。 核心包只带一个迁移(带版本管理的 robots.txt 表),不依赖 django.contrib.sites、django.contrib.contenttypes 或任何其他可选的 Django 应用。可选的 contrib 应用(seopath、seoobject)只在你安装它们时才添加各自的迁移;SEO 元数据 mixin 都是抽象模型,只会在你自己的应用里建表。

只有一个依赖。 Django 4.2+,Python 3.10+。

渐进式。 先从给模型加两行代码、在基础模板里加一个标签开始。随着项目成长,再逐步加入后台可编辑的覆盖项、结构化数据、hreflang 和缓存。

为扩展而生。 提供者、schema 配置、head 渲染器以及解析器本身都可以通过稳定且带版本的 API 插拔替换。


快速导航

目标 从这里开始
跑起来 安装
第一个可用示例 快速上手
博客文章 / 文章页 指南:博客文章与文章页
列表 / 索引页 指南:列表页
详情视图 指南:详情视图
无模型视图 指南:无模型视图
第三方模型 指南:第三方模型(seoobject)
按 URL 在后台编辑 指南:基于路径的覆盖(seopath)
JSON-LD 结构化数据 指南:JSON-LD 结构化数据
Open Graph 与社交分享图 指南:Open Graph 与社交分享图
hreflang 与多语言 指南:hreflang 与多语言
站点地图 指南:站点地图
带版本管理的 robots.txt 指南:robots.txt
全站默认值 指南:全站默认值
自定义渲染输出 指南:自定义输出
解析机制 解析机制详解
完整设置参考 参考:设置项
模板标签 参考:模板标签
SeoMetadata 属性 参考:SeoMetadata
扩展点 扩展本套件