diff --git a/djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/management/commands/ping_baidu.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/management/commands/ping_baidu.py index 2c7fbdd6..98addbf4 100644 --- a/djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/management/commands/ping_baidu.py +++ b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/management/commands/ping_baidu.py @@ -1,50 +1,88 @@ +# 导入Django命令基类,用于创建自定义管理命令 from django.core.management.base import BaseCommand -from djangoblog.spider_notify import SpiderNotify -from djangoblog.utils import get_current_site -from blog.models import Article, Tag, Category +# 导入搜索引擎推送工具、站点配置和博客模型 +from djangoblog.spider_notify import SpiderNotify # 搜索引擎推送工具 +from djangoblog.utils import get_current_site # 获取当前站点信息 +from blog.models import Article, Tag, Category # 博客核心模型 +# 获取当前站点的域名(用于生成完整URL) site = get_current_site().domain class Command(BaseCommand): + """ + Django自定义管理命令:向百度搜索引擎推送URL + 用于主动告知百度爬虫网站的更新内容,加速收录 + """ + # 命令的帮助信息(执行python manage.py help ping_baidu时显示) help = 'notify baidu url' def add_arguments(self, parser): + """ + 定义命令参数:指定需要推送的URL类型 + 通过parser添加命令行参数,限制可选值 + """ parser.add_argument( - 'data_type', + 'data_type', # 参数名称 type=str, - choices=[ - 'all', - 'article', - 'tag', - 'category'], - help='article : all article,tag : all tag,category: all category,all: All of these') + choices=[ # 可选参数值 + 'all', # 推送所有类型(文章、标签、分类) + 'article', # 仅推送文章 + 'tag', # 仅推送标签页 + 'category' # 仅推送分类页 + ], + help='指定推送类型:article(所有文章)、tag(所有标签)、category(所有分类)、all(全部)' + ) def get_full_url(self, path): - url = "https://{site}{path}".format(site=site, path=path) - return url + """ + 生成完整的URL(域名+相对路径) + :param path: 模型实例的相对路径(如/article/1.html) + :return: 完整的URL字符串(如https://example.com/article/1.html) + """ + return f"https://{site}{path}" def handle(self, *args, **options): - type = options['data_type'] - self.stdout.write('start get %s' % type) + """ + 命令核心执行逻辑 + 根据参数类型收集URL,推送给百度搜索引擎 + """ + # 获取用户指定的推送类型 + data_type = options['data_type'] + self.stdout.write(f'开始收集{data_type}类型的URL...') + # 存储待推送的URL列表 urls = [] - if type == 'article' or type == 'all': + + # 1. 收集文章URL(已发布状态) + if data_type == 'article' or data_type == 'all': + # 筛选所有已发布的文章 for article in Article.objects.filter(status='p'): + # 调用文章模型的get_full_url方法获取完整URL urls.append(article.get_full_url()) - if type == 'tag' or type == 'all': + + # 2. 收集标签页URL + if data_type == 'tag' or data_type == 'all': for tag in Tag.objects.all(): - url = tag.get_absolute_url() - urls.append(self.get_full_url(url)) - if type == 'category' or type == 'all': + # 获取标签页的相对路径,再生成完整URL + relative_url = tag.get_absolute_url() + urls.append(self.get_full_url(relative_url)) + + # 3. 收集分类页URL + if data_type == 'category' or data_type == 'all': for category in Category.objects.all(): - url = category.get_absolute_url() - urls.append(self.get_full_url(url)) + # 获取分类页的相对路径,再生成完整URL + relative_url = category.get_absolute_url() + urls.append(self.get_full_url(relative_url)) + # 输出待推送的URL数量 self.stdout.write( - self.style.SUCCESS( - 'start notify %d urls' % - len(urls))) + self.style.SUCCESS(f'准备推送{len(urls)}条URL...') + ) + + # 调用工具类向百度推送URL SpiderNotify.baidu_notify(urls) - self.stdout.write(self.style.SUCCESS('finish notify')) + + # 推送完成,输出成功信息 + self.stdout.write(self.style.SUCCESS('URL推送完成!')) \ No newline at end of file