上一篇文章介绍了pear-admin用到flask的技术, 深入代码后发现其结构也是令人眼前一亮, 结构化,模块化, 解耦做得非常优秀。
- 整个项目数据库使用migrate做了版本管理, 使用marshmallow做了序列化,这样数据库修改也非常好迁移,对后面的代码在使用数据库将非常简单。
数据库实现 @3ds/pear-admin-flask/applications/models/init.py
class Dept(db.Model):
__tablename__ = 'admin_dept'
id = db.Column(db.Integer, primary_key=True, comment="部门ID")
parent_id = db.Column(db.Integer, comment="父级编号")
dept_name = db.Column(db.String(50), comment="部门名称")
sort = db.Column(db.Integer, comment="排序")
leader = db.Column(db.String(50), comment="负责人")
phone = db.Column(db.String(20), comment="联系方式")
email = db.Column(db.String(50), comment="邮箱")
status = db.Column(db.Integer, comment='状态(1开启,0关闭)')
remark = db.Column(db.Text, comment="备注")
address = db.Column(db.String(255), comment="详细地址")
create_at = db.Column(db.DateTime, default=datetime.datetime.now, comment='创建时间')
update_at = db.Column(db.DateTime, default=datetime.datetime.now, onupdate=datetime.datetime.now, comment='创建时间')
序列化实现 @3ds/pear-admin-flask/applications/schemas/init.py
class DeptSchema(SQLAlchemyAutoSchema):
class Meta:
model = Dept # table = models.Album.__table__
# include_relationships = True # 输出模型对象时同时对外键,是否也一并进行处理
include_fk = True # 序列化阶段是否也一并返回主键
# fields= ["id","name"] # 启动的字段列表
# exclude = ["id","name"] # 排除字段列表
- 整个项目的配置抽取到集中管理配置的config.py中, 结构分为组件(plugs),蓝图(Blueprint),命令(script)几部分。
def create_app():
app = Flask(os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
# 引入配置
app.config.from_object(BaseConfig)
# 注册flask组件
init_plugs(app)
# 注册蓝图
init_bps(app)
# 注册命令
init_script(app)
return app
a. 组件是一些集成到项目中的附加功能的定义, 通过 @3ds/pear-admin-flask/applications/extensions/init.py 中管理, 手动添加 初始化的 init 函数。原项目中有登陆,邮箱等组件的初始化。
def init_plugs(app: Flask) -> None:
init_login_manager(app)
init_databases(app)
init_template_directives(app)
init_error_views(app)
init_mail(app)
init_upload(app)
init_migrate(app)
init_session(app)
b. 蓝图是对服务器接口的实现,主要有两个部分, 一个部分是集成的服务器接口, 另外还添加了一个接口插件功能, 可以通过config.py 中的 P L U G I N E N A B L E F O L D E R S PLUGIN_ENABLE_FOLDERS PLUGINENABLEFOLDERS 变量外部动态添加插件。其在 @3ds/pear-admin-flask/applications/view/init.py 中管理。
def init_bps(app):
register_system_bps(app) # 系统接口
register_plugin_views(app) # 插件的遍历程序
添加配件的方法是 在@3ds/pear-admin-flask/applications/config.py 的 P L U G I N E N A B L E F O L D E R S PLUGIN_ENABLE_FOLDERS PLUGINENABLEFOLDERS 中 添加plugins实现好的插件目录。如下我添加官方自带的 r e p l a c e P a g e replacePage replacePage 。
PLUGIN_ENABLE_FOLDERS = ['replacePage']
c. 命令是可以通过 flask 命令行命令进行执行的, 主要是通过上一篇文中介绍的 A p p G r o u p AppGroup AppGroup 实现的。管理脚本在 @ 3ds/pear-admin-flask/applications/common/script/init.py 中,可自行修改。
def init_script(app: Flask):
app.cli.add_command(admin_cli)
- 部署配置上, pear-admin 项目也是做得比较齐全,有运行的readme说明, 准备了 run.sh 脚本, 还有一件部署的 docker 套餐。 总之通过项目提供的资料要把项目跑起来还是比较简单。
PS:我这里说下, 如果大家对社区有了解的话,docker已经远离开源了,大家可以使用 nerdctl 替代docker.后面还可以用sealos上k8s项目。具体我在 容器原来发生了这么多事情 中有介绍。
我个人认为项目还需要优化的地方。
- 日志系统还可以优化一下, 使用统一日志输出有助于后期维护,日志不用写在数据库中,写在数据库中可能会影响日志迁移等功能的效率。
- 使用flask-rustx 项目对结构可以再进一步优化,对后期的项目理解会更好。
- 使用celery强化延时任务,完成服务器系统延时任务请求的闭环。
最近发现了好多国内开源的好项目, 慢慢消化一下,大家有什么意见可以在评论区讨论。