FastAPI-Admin,开箱即用的后台管理面板

简介 FastAPI-Admin 是一个基于 FastAPI 与 TortoiseORM 的开箱即用的后台管理面板,UI 框架使用了tabler,仅需要少量配置,即可快速搭建一个 CURD 管理台,类似于 Django Admin。 项目地址:https://github.com/fastapi-admin/fastapi-admin 线上 DEMO:https://fastapi-admin.long2ice.io/admin/login 用户名:admin 密码:123456 预览 特性 开箱即用,配置丰富。 集成登录、验证码、权限控制。 易于扩展,自定义。 内置多种组件,功能丰富的 CRUD 界面。 其它更多特性。 开发 FastAPI-Admin 基于 FastAPI 与 TortoiseORM,使用 jinja2 渲染前端界面。最早期的版本是使用前后端分离,通过 rest 协议进行通信,前端框架与查询协议直接来源于另一个开源项目,后来由于不便于扩展、不熟悉等原因放弃,并基于 tabler ui 开发了现在的版本。实现过程中参考了 Django Admin,通过后端进行资源配置,渲染菜单,界面等。并且实现了多种展示组件、编辑组件、筛选组件等。 除此之外,Pro 版本还实现了基于资源读写的权限控制,包括管理员、角色、权限三种对象。 文档 文档地址:https://fastapi-admin-docs.long2ice.io 目前英文文档更全面一些,中文文档还待编写中。

June 25, 2021

开源项目计划

有一些计划中的,感兴趣,想做的一些开源项目,在此记录一下,以免遗忘。 trader 项目地址:https://github.com/long2ice/trader 用 Go 开发的一个加密货币自动交易框架,使用自定义策略进行买卖,最终从中获利,项目优先级略高,基本框架已经搭建好,后续准备支持更多的交易所以及合约。 rearq 项目地址:https://github.com/long2ice/rearq 一个 asyncio 的分布式异步任务执行框架,Fork 自另外一个项目,做了一些修改和提升,最终想做成类似于 celery 或者 airflow 那样,带有 api 与 web 界面的 asyncio 异步任务框架。 fastapi-admin 项目地址:https://github.com/long2ice/fastapi-admin 打算用react-admin作为前端重写一个版本,感觉这个似乎更完善,要是早知道的话就好了。 dataetl 项目地址:https://github.com/long2ice/dataetl 打算将synch翻译成 Go 语言实现,顺便学习 Go 语言,优先级不那么高,因为有了 trader 这个项目。 MiraiPy 项目地址:https://github.com/long2ice/MiraiPy 原本打算将MiraiGo这个项目翻译成 Python 实现,可惜没时间暂时搁置了。 aiomysqlreplication 项目地址:https://github.com/long2ice/aiomysqlreplication 原本想实现一个 asyncio 下的mysql-replication,也是没有时间与契机,暂时搁置。 其它 想实现一个 Go 下面的 ORM,因为感觉现在的一些 ORM 比如gorm太难用了,不过 Go 语言限制比较多,不如 Python 灵活,估计需要进一步调研以及技术沉淀。 tortoise-orm性能优化,可能需要学习一下 Cython,或者重写一个性能更高的 asyncio MySQL 驱动,类似asyncpg。

January 29, 2021

一个由于MySQL Binlog同步问题导致的bug

最近在项目中遇到了一个很奇怪的 bug,从发现到解决一共持续了一周左右的时间。 bug 现象:插入一条语句后在执行 select,会报查询不到记录,但是该 bug 只偶尔复现,频率很低。 刚开始的时候尝试了很多种方法,猜测是不是 ORM 框架问题,或者是 MySQL 版本问题,但是经过测试都不会复现。并且由于出现的概率很低,很不好 debug。 在问题的代码周围打了很多 log,也还是没有找到问题所在。 就在有一次我上厕所的时候灵机一动,联想到我们用的是阿里云的读写分离数据库,猜测是否是因为 MySQL 同步延迟导致的? 查询了阿里云文档后,地址为https://help.aliyun.com/knowledge_detail/41767.html?spm=5176.11065259.1996646101.searchclickresult.3d3c31d8pXWGBr,最终确定正是这个问题。 解决方案有两种,一种是在同一事务中支持先写入再读取操作,另一种是使用单实例,放弃读写分离。

October 26, 2020

从mysql2ch到synch,一次重构与升级

项目地址 https://github.com/long2ice/synch mysql2ch mysql2ch 从二月份开始到现在已经接近四个月,项目起初是源于公司的需求,同步 MySQL 的数据到 ClickHouse 进行分析与统计。当时调研了一圈,发现并没有符合需求的项目,只找到一个勉强可用的,于是在该项目之上进行开发与完善。 synch mysql2ch 项目改名为 synch,其主要原因在于 mysql2ch 支持了 postgres 的同步,再取名为 mysql2ch 就有些不合适了,遂改名为 synch,意思是同步到 ClickHouse,其项目目标是同步其它类型的数据库到 ClickHouse 中。 当前架构 设计与实现 最开始的版本非常简陋,只是实现了监听 mysql binlog 然后直接插入到 ClickHouse。在后续的开发与迭代中,逐渐实现了以下功能,以及引入了中间件。 命令行 命令行对于一个独立程序是有必要的。命令行程序可以接受自定义的参数,通过在程序指定不同的参数,可以使用其不同的功能,对于那些需要每次启动都可能会不同的参数,将其放在命令行参数中是有必要的。 配置文件 丰富的配置项可以将程序的自定义配置暴露出来,以满足个性化的运行需求,增强程序的自定义性。 模块分离 该项目分为三个模块,除了源数据库与目标数据库,也就是 ClickHouse 之外,包含生产端、消息队列、消费端。模块的分离是为了解耦,各个模块专注于自身的功能实现以及可靠性。以及借助于消息队列,实现分布式消费。 消息队列 消息队列的引入是为了增加程序的健壮性以及增加生产与消费的性能。通过引入消息队列,将 binlog 先缓冲到消息队列中而不是直接插入到 ClickHouse,避免了当程序崩溃时内存数据的丢失。并且借助于消息队列的 ack 机制,可以保证消息的可靠消费;以及借助消息队列的高吞吐量,将消费者与生产者分离,生产者与消费者之间互不影响,异步工作。 另外一点考虑到 binlog 的有序性,消息队列的选型也是需要考虑的,目前选择了 kafka 和 redis。redis5.0 提供了原生的消息队列并且具有所有消息队列该有的功能,并且消息是有序的,其轻量的特性在并发量不那么大的时候是一个很好的选择;而选择 kafka 是因为其强大的吞吐量,并且单个 topic 的单个分区也是有序的,可以很好的对应需要同步的数据库与数据库表。 redis redis 的引入其一是为了缓存 MySQL 的 binlog,因为 MySQL 的 binlog 是不断在变化的,当程序崩溃或重启时,需要记录当前的 binlog,然后下次启动时需要从上次的位置继续监听;其二是作为消息队列,相比 kafka 而且因为本身既作为缓存组件也作为消息队列,组件依赖较少。 ...

June 30, 2020

FastAPI-Admin,快速搭建基于fastapi与tortoise-orm的管理后台

简介 FastAPI-admin 是一个基于fastapi和 tortoise-orm和rest-admin的后台管理面板。 FastAPI-admin 提供了开箱即用的 CRUD,只需少量的配置。 在线 demo 地址 https://fastapi-admin.long2ice.io 用户名: admin 密码: 123456 数据会每天进行重置。 预览 快速开始 本地运行样例 查看examples。 执行git clone https://github.com/long2ice/fastapi-admin.git. 创建数据库fastapi-admin并且导入examples/example.sql。 执行python setup.py install。 执行env PYTHONPATH=./ DATABASE_URL=mysql://root:123456@127.0.0.1:3306/fastapi-admin python3 examples/main.py: INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) INFO: Started reloader process [89005] INFO: Started server process [89009] INFO: Waiting for application startup. INFO: Tortoise-ORM startup connections: {'default': 'mysql://root:123456@127.0.0.1:3306/fastapi-admin'} apps: {'models': {'models': ['examples.models'], 'default_connection': 'default'}} INFO: Tortoise-ORM started, {'default': <tortoise.backends.mysql.client.MySQLClient object at 0x110ed6760>}, {'models': {'Category': <class 'examples.models.Category'>, 'Product': <class 'examples.models.Product'>, 'User': <class 'examples.models.User'>}} INFO: Tortoise-ORM generating schema INFO: Application startup complete. 执行cd front && npm install && npm run serve: ...

May 5, 2020