Django自定义manage.py命令实现hexo博客迁移

实现了hexo的md文件格式解析,通过什么方式怎么来迁移hexo的博客到django的博客呢?开始想到的是通过Django的manage.py的shell命令,通过shell可以执行写好的python脚本进行hexo的md文件格式解析并入库。后来想想为啥不直接自定义一个manage.py的命令直接进行迁移呢?就如我们新建Django工程迁移数据库一样,执行python manage.py migrate来迁移数据库。我们可以定义python manage.py xxx来执行的迁移hexo博客。

自定义Django-admin命令分三步:创建management文件夹、编写命令代码、测试验证

一、创建management文件夹

自定义的Django-admin管理命令本质上是一个python脚本文件,它的存放路径必须遵循一定的规范,一般位于app/management/commands目录。整个文件夹的布局如下所示:
注意app要在setting中注册
在blog/management/commands包下面创建transblog.py文件
在这里插入图片描述

这里有两个要注意的地方:

1、app要在setting中注册。如blog在setting中注册了所以可以在blog/management/commands包下面创建transblog.py文件,api和common都没有在setting中注册所以在这两个目录下创建的不会作为管理命令生效。
2、创建的management/commands是Python包,不是单纯的目录,区别就是目录里必须有init.py文件,空文件都可以。

二、编写命令代码

创建命令管理文件后就可以在该文件中编写命令代码了。
每一个自定义的管理命令本质是一个Command类, 它继承了Django的Basecommand或其子类, 主要通过重写handle()方法实现自己的业务逻辑代码,而add_arguments()则用于帮助处理命令行的参数,如果运行命令时不需要额外参数,可以不写这个方法。
transblog.py的参考代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# -*- coding: utf-8 -*-
"""
:author: XieJava
:url: http://ishareread.com
:copyright: © 2021 XieJava <xiejava@ishareread.com>
:license: MIT, see LICENSE for more details.
"""
import os

from blog.models import BlogPost,BlogCategory,Tag
from utils.parseblog import parseblog
from django.core.management.base import BaseCommand

class Command(BaseCommand):
help='读取指定目录的.md文件解析至ishareblog'

def add_arguments(self, parser):
parser.add_argument('--path',help='输入.md文件的目录')
parser.add_argument('--file',help='输入.md文件的路径')

def handle(self, *args, **options):
inputfile = input('请输入指定的目录路径或.md文件路径:')
if inputfile.find('.md') > 0:
self.transblogbyfile(inputfile)
else:
self.transblogbypath(inputfile)
if options['path']:
self.transblogbypath(options['path'])
if options['file']:
self.transblogbyfile(options['file'])

'''读取目录解析md文件并写入数据库'''
def transblogbypath(self,filepath='',):
try:
files = os.listdir(filepath)
for file in files:
if file.find('.md') > 0:
blog_file = os.path.join(filepath, file)
self.transblogbyfile(blog_file)
except FileNotFoundError as e:
print('请确认输入是否正确。',e)

'''读取md文件入库'''
def transblogbyfile(self,blogfile=''):
blog_info = parseblog(blogfile)
filename=os.path.basename(blogfile)
#判断是否存在相同的title
qs=BlogPost.objects.filter(title=blog_info['title'])
if len(qs)==0:
category = None
tag_objs = []
if 'categories' in blog_info:
categories=blog_info['categories']
if len(categories)>0:
category_title = categories[0]
category_qs=BlogCategory.objects.filter(title=category_title)
if len(category_qs)>0:
category=category_qs[0]
if 'tags' in blog_info:
tags=blog_info['tags']
for tag in tags:
tag_obj,b=Tag.objects.get_or_create(tag=tag)
print(tag_obj.id)
tag_objs.append(tag_obj)
blog = BlogPost()
blog.title = blog_info['title']
blog.content = blog_info['content']
blog.isShow = 1 #默认显示
blog.summary=blog.content[0:200] #默认提取内容的前200个字作为摘要
blog.category=category
blog.blogSource = filename
blog.pubTime=blog_info['date']
blog.save()
if len(tag_objs)>0:
blog.tags.add(*tag_objs)
print(filename + '读取解析入库成功!')
else:
print(blog_info['title']+'已经存在!')

代码很简单,就是根据读取命令行的参数,这个参数就是需要迁移hexo的.md文件的目录或文件路径,读取目录或文件路径进行文件的解析,并写入到数据库。
.md文件的解析参考:Python二十行代码实现hexo的md文件格式解析

三、测试验证

命令代码写完后就可以进行测试了。
在命令行输入python manage.py 可以看到自定义的transblog已经加入到管理命令了
transblog已经加入到管理命令

输入 python manage.py transblog -h
会提示命令的参数和用法:
管理命令帮助

如执行 python manage.py transblog 会提示”请输入指定的目录路径或.md文件路径:”

1
2
(venv) PS D:\Python\study\pythonproject\ishareblog\ishareblog> python manage.py transblog
请输入指定的目录路径或.md文件路径:

我们输入需要迁移的.md文件或路径
如:E:\CloudStation\personal\xiejavablog\myhexo\myblog\source_posts\2022-07-27-Python二十行代码实现hexo的md文件格式解析.md
不出意外的情况下控制台会打印“XXXX.md读取解析入库成功!”的信息
执行效果

访问博客,可以看到文章已经迁移过来了
执行效果
全部代码仓库:https://gitee.com/ishareblog/ishareblog


作者博客:http://xiejava.ishareread.com/

0%