上一篇文章介绍了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强化延时任务,完成服务器系统延时任务请求的闭环。
最近发现了好多国内开源的好项目, 慢慢消化一下,大家有什么意见可以在评论区讨论。