|
|
|
|
@ -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推送完成!'))
|