程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Django自定義manage.py命令實現hexo博客遷移

編輯:Python

實現了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的參考代碼如下:

# -*- coding: utf-8 -*-
""" :author: XieJava :url: http://ishareread.com :copyright: 2021 XieJava <[email protected]> :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已經加入到管理命令了

輸入 python manage.py transblog -h
會提示命令的參數和用法:

如執行 python manage.py transblog 會提示"請輸入指定的目錄路徑或.md文件路徑:"

(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/


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved