首先是仓库地址: hengshizhi/OrangeRedSeaweed: 轻量级博客 (github.com)
本项目提出于2023年6月4日,本质是为了更好的自定义自己的博客提出的非商业练手项目(用自己熟练的语言:python)
愿景
1.代替我现在用的屎山WordPress
2.可以使用python灵活的构建
3.可以自己写主题
4.顶级模块化
5.高效异步的响应
6.前后端分离
7.反爬虫(使爬取成本变高)
8.希望尽量拒绝屎山,避免”牵一发动全身“的情况,做到每个模块互相隔离,尽量使用面向对象的编程思想进行开发(以前习惯函数式)
简介
运用了自己的API开发框架automatic-octo-dollop(没开源)来进行开发,基层框架为Sanic
在automatic-octo-dollop的基础上加入mod和用户的功能,基于其他用户数据(也就是非核心数据)进行博客的数据处理
主要概念
模组(mod)
每个模组有独立的功能,准确来说,OrangeRedSeaweed 就是基于 automatic-octo-dollop and mod function and user function 上的mod开发出来的,所以 OrangeRedSeaweed 的主体就是mod
在这里可以利用 mod 管理 mod ,可以利用 mod 创建 API ,可以利用 mod 写出主题功能….可以利用 mod 构建任何 web 应用(到时候会加入 ws 接口)
mod的核心调用代码也就下面这些
# /mod/mod.py
# Mod mechanism entry
import importlib
from sanic.response import text
import PathInfo as PathInfo
def modlists() -> dict:
'''mod information list'''
return PathInfo.Dict('./mod/mods','./')
def ImportMod(ModName):
b = importlib.import_module('.mods.{ModName}.main'.format(ModName=ModName), __package__)
return b
def main(get_or_post,EnableSession,rep,**para):
'''
Main function when mod is actively called
Applied to HTTP API
'''
ModName = get_or_post('ModName')
ApiName = get_or_post('ApiName')
if (ModName == None or ApiName == None):
return rep(text('Missing "ModName" or "ApiName" parameters',status=400))
else:
b = ImportMod(ModName)
return b.main(api = {})[ApiName](get_or_post,EnableSession,rep,**para)
def AtRuntimeForTheFirstTime():
'''
This function is called every time the program runs
used to load the code for all mod program runtime
'''
for k,v in modlists().items():
try:
ImportMod(k).AtRuntimeForTheFirstTime() # Functions that will be executed every time the program runs mod
except:
pass # No self starting function
AtRuntimeForTheFirstTime()
可以看到,原生的mod功能只有HTTP调用和程序启动时调用mod的一个函数
所以,mod 的其他信息(如 logo ,简介等)都是一个叫做 “mod” 的 mod 规定的
modAPI调用方式
"/api/mod?ModName={ModName}&ApiName={ApiName}&...OtherParameters"
ModName 是 mod 的名字
ApiName 是 modAPI 的名字
前端(front_end)
这里放有程序的前端,前端的调用逻辑很简单,和普通的web服务器一致
我们的mod可以更改前端,使其更加丰富
“主题”mod也是在每次启动的时候更改前端为主题里面的文档
模组的JS部分(modjs)
虽然这个功能是“mod”mod里面的,但是我认为还是应该说一下
它mod的js部分,通常包括一些modAPI的SDK
例子:
var helloworld=null; // This module does not have modjs
//Modjs v1.0
//All rights reserved by Star Weaving
//Modjs is used to load the JavaScript code for mod
结尾
这个只是一个设想,部分已经实现
大佬大佬