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 |
| 扩展点 | 扩展本套件 |