|
|
|
|
@ -1,43 +1,73 @@
|
|
|
|
|
# 导入日志模块,用于记录系统运行时的信息和错误
|
|
|
|
|
import logging
|
|
|
|
|
|
|
|
|
|
# 从django.utils导入timezone,用于获取当前时间
|
|
|
|
|
from django.utils import timezone
|
|
|
|
|
|
|
|
|
|
# 导入自定义的缓存工具和获取博客设置的工具函数
|
|
|
|
|
from djangoblog.utils import cache, get_blog_setting
|
|
|
|
|
# 导入当前应用下的Category(分类)和Article(文章)模型
|
|
|
|
|
from .models import Category, Article
|
|
|
|
|
|
|
|
|
|
# 创建日志记录器,用于记录当前模块的日志信息
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def seo_processor(requests):
|
|
|
|
|
"""
|
|
|
|
|
自定义上下文处理器,用于在所有模板中全局共享SEO相关的配置和数据
|
|
|
|
|
|
|
|
|
|
上下文处理器是Django的一个功能,允许你在所有模板中自动添加变量,
|
|
|
|
|
无需在每个视图函数中单独传递,特别适合网站全局配置信息的共享。
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
requests: Django请求对象,包含当前请求的相关信息(如域名、协议等)
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
dict: 包含网站配置、分类、页面等信息的字典,将被注入到所有模板中
|
|
|
|
|
"""
|
|
|
|
|
# 定义缓存键,用于标识当前处理器的缓存数据
|
|
|
|
|
key = 'seo_processor'
|
|
|
|
|
# 尝试从缓存中获取数据,减少数据库查询和计算开销
|
|
|
|
|
value = cache.get(key)
|
|
|
|
|
|
|
|
|
|
# 如果缓存中存在数据,直接返回缓存内容
|
|
|
|
|
if value:
|
|
|
|
|
return value
|
|
|
|
|
else:
|
|
|
|
|
# 缓存未命中时,记录日志并重新计算数据
|
|
|
|
|
logger.info('set processor cache.')
|
|
|
|
|
# 获取博客的全局设置(从数据库或其他配置源)
|
|
|
|
|
setting = get_blog_setting()
|
|
|
|
|
|
|
|
|
|
# 构建需要传递给模板的全局变量字典
|
|
|
|
|
value = {
|
|
|
|
|
'SITE_NAME': setting.site_name,
|
|
|
|
|
'SHOW_GOOGLE_ADSENSE': setting.show_google_adsense,
|
|
|
|
|
'GOOGLE_ADSENSE_CODES': setting.google_adsense_codes,
|
|
|
|
|
'SITE_SEO_DESCRIPTION': setting.site_seo_description,
|
|
|
|
|
'SITE_DESCRIPTION': setting.site_description,
|
|
|
|
|
'SITE_KEYWORDS': setting.site_keywords,
|
|
|
|
|
'SITE_NAME': setting.site_name, # 网站名称
|
|
|
|
|
'SHOW_GOOGLE_ADSENSE': setting.show_google_adsense, # 是否显示谷歌广告
|
|
|
|
|
'GOOGLE_ADSENSE_CODES': setting.google_adsense_codes, # 谷歌广告代码
|
|
|
|
|
'SITE_SEO_DESCRIPTION': setting.site_seo_description, # 网站SEO描述(用于搜索引擎)
|
|
|
|
|
'SITE_DESCRIPTION': setting.site_description, # 网站描述
|
|
|
|
|
'SITE_KEYWORDS': setting.site_keywords, # 网站关键词(用于SEO)
|
|
|
|
|
# 网站基础URL(如https://example.com/)
|
|
|
|
|
'SITE_BASE_URL': requests.scheme + '://' + requests.get_host() + '/',
|
|
|
|
|
'ARTICLE_SUB_LENGTH': setting.article_sub_length,
|
|
|
|
|
'nav_category_list': Category.objects.all(),
|
|
|
|
|
'ARTICLE_SUB_LENGTH': setting.article_sub_length, # 文章摘要长度
|
|
|
|
|
'nav_category_list': Category.objects.all(), # 导航栏显示的所有分类
|
|
|
|
|
# 导航栏显示的页面(类型为'p'即page,状态为'p'即published)
|
|
|
|
|
'nav_pages': Article.objects.filter(
|
|
|
|
|
type='p',
|
|
|
|
|
status='p'),
|
|
|
|
|
'OPEN_SITE_COMMENT': setting.open_site_comment,
|
|
|
|
|
'BEIAN_CODE': setting.beian_code,
|
|
|
|
|
'ANALYTICS_CODE': setting.analytics_code,
|
|
|
|
|
"BEIAN_CODE_GONGAN": setting.gongan_beiancode,
|
|
|
|
|
"SHOW_GONGAN_CODE": setting.show_gongan_code,
|
|
|
|
|
"CURRENT_YEAR": timezone.now().year,
|
|
|
|
|
"GLOBAL_HEADER": setting.global_header,
|
|
|
|
|
"GLOBAL_FOOTER": setting.global_footer,
|
|
|
|
|
"COMMENT_NEED_REVIEW": setting.comment_need_review,
|
|
|
|
|
'OPEN_SITE_COMMENT': setting.open_site_comment, # 是否开启网站评论功能
|
|
|
|
|
'BEIAN_CODE': setting.beian_code, # 网站备案号
|
|
|
|
|
'ANALYTICS_CODE': setting.analytics_code, # 网站统计代码(如Google Analytics)
|
|
|
|
|
"BEIAN_CODE_GONGAN": setting.gongan_beiancode, # 公安备案号
|
|
|
|
|
"SHOW_GONGAN_CODE": setting.show_gongan_code, # 是否显示公安备案号
|
|
|
|
|
"CURRENT_YEAR": timezone.now().year, # 当前年份(用于页脚版权信息等)
|
|
|
|
|
"GLOBAL_HEADER": setting.global_header, # 全局页眉代码(如额外的CSS/JS)
|
|
|
|
|
"GLOBAL_FOOTER": setting.global_footer, # 全局页脚代码
|
|
|
|
|
"COMMENT_NEED_REVIEW": setting.comment_need_review, # 评论是否需要审核
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# 将数据存入缓存,有效期为10小时(60秒*60分*10小时)
|
|
|
|
|
cache.set(key, value, 60 * 60 * 10)
|
|
|
|
|
return value
|
|
|
|
|
# 返回构建的全局变量字典
|
|
|
|
|
return value
|