V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
atomi
V2EX  ›  Python

FastAPI-Amis-Admin: 一个拥有高性能,高效率,易拓展的 fastapi 管理后台框架

  •  2
     
  •   atomi · 2022-03-24 09:42:31 +08:00 · 5302 次点击
    这是一个创建于 1004 天前的主题,其中的信息可能已经有所发展或是发生改变。

    项目介绍

    FastAPI-Amis-Admin

    fastapi-amis-admin 是一个拥有高性能,高效率,易拓展的 fastapi 管理后台框架.
    启发自 Django-Admin,并且拥有不逊色于 Django-Admin 的强大功能.

    Pytest Package version Downloads Chat on Gitter 229036692

    源码 · 在线演示 · 文档 · 文档打不开?


    fastapi-amis-admin是一个基于fastapi+amis开发的高性能并且高效率 web-admin 框架,使用 Python 3.7+ 并基于标准的 Python 类型提示. fastapi-amis-admin开发的初衷是为了完善fastapi应用生态, 为fastapi web 应用程序快速生成一个可视化管理后台. fastapi-amis-admin遵循Apache2.0协议免费开源, 但是为了更好的长期运营与维护此项目, fastapi-amis-admin非常希望能够得到大家的赞助与支持.

    关键特性

    • 性能极高:基于FastAPI, 可享受FastAPI的全部优势.

    • 效率更快:完善的编码类型提示, 代码可重用性更高.

    • 支持异步和同步混合编写: ORM基于SQLModel+Sqlalchemy, 可自由定制数据库类型, 支持同步及异步模式, 可拓展性强.

    • 前后端分离: 前端由Amis渲染, 后端接口由fastapi-amis-admin自动生成, 接口可重复利用.

    • 可拓展性强: 后台页面支持Amis页面及普通html页面,开发者可以很方便的自由定制界面.

    • 自动生成 API 文档: 由FastAPI自动生成接口文档,方便开发者调试,以及接口分享.

    核心依赖

    项目组成

    fastapi-amis-admin由三部分核心模块组成,其中amis, fastapi-sqlmodel-crud 可作为独立模块单独使用,amis_admin基于前者共同构建.

    • amis: 基于baidu amispydantic数据模型构建库,用于快速生成 /解析amis json 数据.
    • fastapi-sqlmodel-crud: 基于FastAPI+SQLModel, 用于快速构建 Create,Read,Update,Delete 通用 API 接口.
    • amis_admin: 启发自Django-Admin, 结合amis+fastapi-sqlmodel-crud, 用于快速构建Web Admin管理后台.

    安装

    pip install fastapi_amis_admin
    

    简单示例

    from fastapi import FastAPI
    from fastapi_amis_admin.amis_admin.settings import Settings
    from fastapi_amis_admin.amis_admin.site import AdminSite
    
    # 创建 FastAPI 应用
    app = FastAPI()
    
    # 创建 AdminSite 实例
    site = AdminSite(settings=Settings(database_url_async='sqlite+aiosqlite:///admisadmin.db'))
    
    # 挂载后台管理系统
    site.mount_app(app)
    
    if __name__ == '__main__':
        import uvicorn
    
        uvicorn.run(app, debug=True)
    

    模型管理示例

    from fastapi import FastAPI
    from sqlmodel import SQLModel
    from fastapi_amis_admin.amis_admin.settings import Settings
    from fastapi_amis_admin.amis_admin.site import AdminSite
    from fastapi_amis_admin.amis_admin import admin
    from fastapi_amis_admin.models.fields import Field
    
    # 创建 FastAPI 应用
    app = FastAPI()
    
    # 创建 AdminSite 实例
    site = AdminSite(settings=Settings(database_url_async='sqlite+aiosqlite:///admisadmin.db'))
    
    
    # 先创建一个 SQLModel 模型,详细请参考: https://sqlmodel.tiangolo.com/
    class Category(SQLModel, table=True):
        id: int = Field(default=None, primary_key=True, nullable=False)
        name: str = Field(title='CategoryName')
        description: str = Field(default='', title='Description')
    
    
    # 注册 ModelAdmin
    @site.register_admin
    class CategoryAdmin(admin.ModelAdmin):
        page_schema = '分类管理'
        # 配置管理模型
        model = Category
    
    
    # 挂载后台管理系统
    site.mount_app(app)
    
    
    # 创建初始化数据库表
    @app.on_event("startup")
    async def startup():
        await site.create_db_and_tables()
    
    
    if __name__ == '__main__':
        import uvicorn
    
        uvicorn.run(app, debug=True)
    

    表单管理示例

    from typing import Any
    from fastapi import FastAPI
    from pydantic import BaseModel
    from starlette.requests import Request
    from fastapi_amis_admin.amis.components import Form
    from fastapi_amis_admin.amis_admin import admin
    from fastapi_amis_admin.amis_admin.settings import Settings
    from fastapi_amis_admin.amis_admin.site import AdminSite
    from fastapi_amis_admin.crud.schema import BaseApiOut
    from fastapi_amis_admin.models.fields import Field
    
    # 创建 FastAPI 应用
    app = FastAPI()
    
    # 创建 AdminSite 实例
    site = AdminSite(settings=Settings(database_url_async='sqlite+aiosqlite:///admisadmin.db'))
    
    
    # 注册 FormAdmin
    @site.register_admin
    class UserLoginFormAdmin(admin.FormAdmin):
        page_schema = 'UserLoginForm'
        # 配置表单信息, 可省略
        form = Form(title='这是一个测试登录表单', submitText='登录')
    
        # 创建表单数据模型
        class schema(BaseModel):
            username: str = Field(..., title='用户名', min_length=3, max_length=30)
            password: str = Field(..., title='密码')
    
        # 处理表单提交数据
        async def handle(self, request: Request, data: BaseModel, **kwargs) -> BaseApiOut[Any]:
            if data.username == 'amisadmin' and data.password == 'amisadmin':
                return BaseApiOut(msg='登录成功!', data={'token': 'xxxxxx'})
            return BaseApiOut(status=-1, msg='用户名或密码错误!')
    
    
    # 挂载后台管理系统
    site.mount_app(app)
    
    if __name__ == '__main__':
        import uvicorn
    
        uvicorn.run(app, debug=True)
    

    界面预览

    • Open http://127.0.0.1:8000/admin/ in your browser:

    ModelAdmin

    • Open http://127.0.0.1:8000/admin/docs in your browser:

    Docs

    未来计划

    • bug 修复,细节完善.
    • 完善用户教程文档.
    • 不断拓展与完善核心功能.

    许可协议

    • fastapi-amis-admin基于Apache2.0开源免费使用,可以免费用于商业用途,但请在展示界面中明确显示关于 FastAPI-Amis-Admin 的版权信息.
    12 条回复    2022-04-07 13:35:17 +08:00
    xabcstack
        1
    xabcstack  
       2022-03-24 09:49:17 +08:00
    点赞
    so1n
        2
    so1n  
       2022-03-24 10:27:14 +08:00
    SQLmodel 支持异步了吗?看了代码好多像都是 async 里面写的都是阻塞函数
    xooass
        3
    xooass  
       2022-03-24 10:29:43 +08:00
    点了进去后发现我已经 stats 过了
    jackleeforce3615
        4
    jackleeforce3615  
       2022-03-24 10:59:35 +08:00
    点赞,不过 FastAPI 的作者好像也有一个类似的项目: https://github.com/tiangolo/full-stack-fastapi-postgresql
    atomi
        5
    atomi  
    OP
       2022-03-24 11:17:40 +08:00
    @so1n SQLModel 支持 sqlalchemy 全部功能, 异步当然支持, 你可能没有认真看文档和代码哦...
    atomi
        6
    atomi  
    OP
       2022-03-24 11:23:24 +08:00
    @jackleeforce3615 两个不一样哦, 区别很大, 作者这个是一个完整的项目, 要利用起来需要研究里面的代码在这个基础上面修改. FastAPI-Amis-Admin 是一个类似 Django-Admin 的 python 库, 直接 pip 安装就可以使用,具体的内部实现代码可研究也可以忽略, 而且功能上不逊色于 Django-Admin.
    so1n
        7
    so1n  
       2022-03-24 11:59:35 +08:00
    @atomi 但是 asyncsession 执行的返回结果不是一个 model 把
    atomi
        8
    atomi  
    OP
       2022-03-24 13:16:01 +08:00
    @so1n AsyncSession 实现的方法太多了,你说的"执行的返回结果不是一个 model",`scalar`和`scalars`方法是你想要的效果吗?而且 sqlalchemy 一些不具备的特性, SQLModel 是 sqlalchemy+Pydantic 结合升级加强了很多特性,模型定义,数据校验,序列化,反序列化都非常简洁. 你可以阅读一下 SQLModel 和 sqlalchemy 的官方文档, SQLModel 文档关于异步的文档没有完善, 但是 sqlalchemy 的全部用法都是支持的, 具体效果你可以编写代码来验证.
    ziding
        9
    ziding  
       2022-03-31 11:00:51 +08:00
    感觉和 [sqladmin]( https://github.com/aminalaee/sqladmin) 区别不大,有没有特性对比表?
    ziding
        10
    ziding  
       2022-03-31 11:12:46 +08:00
    demo 不能正常添加记录,提示是成功的……
    atomi
        11
    atomi  
    OP
       2022-04-01 23:18:31 +08:00
    @ziding 在线 demo 是对数据库进行了保护,数据是只读的,无法修改.可以在 github 下载[demo]( https://github.com/amisadmin/fastapi_amis_admin_demo)代码到本地体验数据修改相关的功能.

    `fastapi-amis-admin`和`sqladmin`,`fastapi-admin`都是基于 fastapi 的后台管理框架,区别是支持的功能丰富度不一样,`fastapi-amis-admin`支持的功能最丰富.此外,最大的区别是`sqladmin`,`fastapi-admin`后台页面是基于服务器模板渲染, `fastapi-amis-admin`后台页面是基于 amis 实现客户端浏览器解析服务器返回的 json 生成页面.
    ziding
        12
    ziding  
       2022-04-07 13:35:17 +08:00
    @atomi 但是添加数据的提示是成功的,要是提示失败也是 OK 的。
    下载了代码,测试了一下,感觉还可以,我找个项目用用看
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1691 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 16:21 · PVG 00:21 · LAX 08:21 · JFK 11:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.