🗣 Wd提问: Django SEO中间件
🤖 Ai回答: Django SEO 中间件实现指南
在 Django 中实现 SEO 中间件可以动态优化页面的元标签(如 title、description、canonical 等),提升搜索引擎友好性。以下是完整实现方案:
1、为什么需要 SEO 中间件?
动态生成 SEO 标签:不同页面需要不同的 meta 标签
避免模板重复代码:集中管理 SEO 逻辑
自动处理 canonical URL:解决重复内容问题
支持 Open Graph 协议:优化社交媒体分享
2、完整中间件实现
python
seo_middleware.py
import re
from django.utils.deprecation import MiddlewareMixin
class SEOMiddleware(MiddlewareMixin):
Django SEO 中间件,自动添加/修改 SEO 相关 meta 标签
使用方式:
1、在视图中设置 request.seo = {
'title': '自定义标题',
'description': '页面描述',
'keywords': '关键词1,关键词2',
'canonical': 'https://65.hk/custom-path/',
'og_image': '/path/to/image.jpg'
}
2、未设置时使用默认值
DEFAULT_TITLE = 默认网站标题
DEFAULT_DESCRIPTION = 默认网站描述,简明扼要说明网站内容
DEFAULT_KEYWORDS = 默认,关键词,列表
DEFAULT_OG_IMAGE = /static/default-og-image.jpg
def process_response(self, request, response):
仅处理 HTML 响应
if 'text/html' not in response.get('Content-Type', ''):
return response
检查响应内容是否可修改
if not hasattr(response, 'content'):
return response
try:
content = response.content.decode('utf-8')
except UnicodeDecodeError:
return response
获取 SEO 数据(视图中设置或使用默认值)
seo_data = getattr(request, 'seo', {})
生成 SEO 标签
seo_tags = self._generate_seo_tags(seo_data, request)
插入到 <head 标签内
head_pattern = re.compile(r'<head\s*', re.IGNORECASE)
if head_pattern.search(content):
content = head_pattern.sub(f'<head\n{seo_tags}', content, count=1)
else:
如果没有 head 标签,尝试在 <html 后插入
html_pattern = re.compile(r'<html\s*', re.IGNORECASE)
content = html_pattern.sub(f'<html\n<head\n{seo_tags}</head', content, count=1)
response.content = content.encode('utf-8')
return response
def _generate_seo_tags(self, seo_data, request):
生成 SEO meta 标签字符串
tags = []
1、Title 标签
title = seo_data.get('title', self.DEFAULT_TITLE)
tags.append(f'<title{title}</title')
2、Description
description = seo_data.get('description', self.DEFAULT_DESCRIPTION)
tags.append(f'<meta name=description content={description}')
3、Keywords (可选,现代SEO中重要性降低)
if 'keywords' in seo_data:
tags.append(f'<meta name=keywords content={seo_data[keywords]}')
4、Canonical URL
canonical = seo_data.get('canonical', request.build_absolute_uri())
tags.append(f'<link rel=canonical href={canonical}')
5、Open Graph 协议
og_title = seo_data.get('og_title', title)
og_description = seo_data.get('og_description', description)
og_image = seo_data.get('og_image', self.DEFAULT_OG_IMAGE)
tags.append(f'<meta property=og:title content={og_title}')
tags.append(f'<meta property=og:description content={og_description}')
tags.append(f'<meta property=og:image content={request.build_absolute_uri(og_image)}')
tags.append(f'<meta property=og:url content={canonical}')
tags.append(f'<meta property=og:type content=website')
6、Twitter Card (可选)
tags.append(f'<meta name=twitter:card content=summary_large_image')
tags.append(f'<meta name=twitter:title content={og_title}')
tags.append(f'<meta name=twitter:description content={og_description}')
tags.append(f'<meta name=twitter:image content={request.build_absolute_uri(og_image)}')
return \n.join(tags)
3、配置步骤
1、添加到 MIDDLEWARE
python
settings.py
MIDDLEWARE = [
..、其他中间件
'your_app.middleware.SEOMiddleware', 替换为你的实际路径
]
2、在视图中设置 SEO 数据
python
views.py
from django.shortcuts import render
def product_detail(request, slug):
获取产品数据
product = Product.objects.get(slug=slug)
设置 SEO 数据
request.seo = {
'title': f{product.name} | 产品详情,
'description': f购买 {product.name} {product.brief_desc},
'keywords': f{product.name}, {product.category.name}, 购买,
'canonical': fhttps://65.hk/products/{slug}/,
'og_image': product.image.url
}
return render(request, 'product.html', {'product': product})
3、未设置时使用默认值
未在视图中设置 `request.seo` 时,中间件将使用 `DEFAULT_*` 常量
可在 `settings.py` 中覆盖默认值:
python
SEO_DEFAULT_TITLE = 我的网站 专业服务
SEO_DEFAULT_DESCRIPTION = 提供高质量服务,解决您的问题
4、关键优化点
| 优化点 | 说明 |
| 动态 Canonical URL | 自动设置规范 URL,避免重复内容问题 |
| Open Graph 支持 | 优化社交媒体分享效果(Facebook/LinkedIn 等) |
| Twitter Card | 适配 Twitter 分享卡片 |
| 响应类型检查 | 仅处理 HTML 响应,不影响 API/静态文件 |
| 字符编码安全 | 正确处理 UTF-8 编码 |
| 容错机制 | 无 `<head` 时自动创建 |
5、使用示例
生成的 HTML 效果:
html
<head
<titleiPhone 15 Pro | 产品详情</title
<meta name=description content=购买 iPhone 15 Pro 超强 A17 Pro 芯片,钛金属设计
<meta name=keywords content=iPhone 15 Pro, Apple, 购买
<link rel=canonical href=https://65.hk/products/iphone-15-pro/
<meta property=og:title content=iPhone 15 Pro | 产品详情
<meta property=og:description content=购买 iPhone 15 Pro 超强 A17 Pro 芯片,钛金属设计
<meta property=og:image content=https://65.hk/media/iphone15.jpg
<meta property=og:url content=https://65.hk/products/iphone-15-pro/
<meta property=og:type content=website
<meta name=twitter:card content=summary_large_image
<! ..、其他标签
</head
6、高级扩展建议
1、SEO 配置中心化
python
settings.py
SEO_CONFIG = {
'DEFAULT_TITLE': '我的网站',
'DEFAULT_OG_IMAGE': '/static/og-default.jpg',
'TITLE_SUFFIX': ' | 专业服务'
}
2、动态模板标题
python
在中间件中
title = f{seo_data.get('title', self.DEFAULT_TITLE)}{settings.SEO_CONFIG['TITLE_SUFFIX']}
3、Google Analytics 支持
python
if settings.GOOGLE_ANALYTICS_ID:
tags.append(f
<script async src=https://www.googletagmanager.com/gtag/js?id={settings.GOOGLE_ANALYTICS_ID}</script
<script
window.dataLayer = window.dataLayer [];
function gtag(){{dataLayer.push(arguments);}}
gtag('js', new Date());
gtag('config', '{settings.GOOGLE_ANALYTICS_ID}');
</script
)
4、结构化数据支持
python
在 _generate_seo_tags 中添加
if 'structured_data' in seo_data:
tags.append(f'<script type=application/ld+json{seo_data[structured_data]}</script')
7、注意事项
1、性能影响:
仅处理 HTML 响应(跳过 API/
📣 商家广告:





0
IP地址: 16.212.249.100
搜索次数: 0
提问时间: 2025-11-12 11:31:09
🛒 域名购买:
q-j.cn
68.hk
sxny.net
chasou.com.cn
63.gold
wg.gs
yq.gs
souzi.com.cn
wk.gs
xhkt.net
❓️ 热门提问:
域名抢注平台学习
pes2020用什么加速器
哪的vps好
站群SEO网站SEO建设
200块组装主机
山鬼花钱挂在哪里镇宅
云服务器 在香港
关键词自动监控服务WHOIS
vnc和vps区别
万户网站建设
豌豆Ai站群搜索引擎系统
🌐 域名评估:
xc.hk
cozc.cn
qjfh.cn
eelp.cn
792.net.cn
j.js.cn
t-v.com.cn
826.net.cn
nn.zj.cn
sun.ah.cn
⛏ 最新挖掘:
凯里酸汤鱼
贵阳烤脑花
都匀毛尖茶
花溪牛肉粉
贵阳烤生蚝
贵阳烤豆腐
贵阳纸包鱼
贵阳特色菜
🖌 热门作画:
🤝 关于我们:
豌豆Ai
域名
建站
站群
留痕
推广
评估
源码
开发Ai
工具
日记
价格
加盟
广告
流量
留言
联系
🗨 加入群聊:
🔗 友情链接:
검색엔진
网站搜索引擎入口
ai提问
🧰 站长工具:
Ai工具 whois查询 搜索
📢 温馨提示:本站所有问答由Ai自动创作,内容仅供参考,若有误差请用“联系”里面信息通知我们人工修改或删除。
👉 技术支持:本站由豌豆Ai提供技术支持,使用的最新版:《豌豆Ai站群搜索引擎系统 V.25.10.25》搭建本站。