灵活的 SQLAlchemy 管理后台

这是一个灵活的 SQLAlchemy 管理后台,采用 Tabler 构建 Web 界面,支持集成到 FastAPI 和 Starlette,实现类似 Django 内置的管理后台功能。灵活的 SQLAlchemy 管理后台

特征

  • SQLAlchemy 同步/异步引擎
  • FastAPI 集成
  • SQL 模型支持
  • 使用 Tabler 的 UI

快速开始

定义一个示例 SQLAlchemy 模型:

from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.ext.declarative import declarative_base


Base = declarative_base()
engine = create_engine(
    "sqlite:///example.db",
    connect_args={"check_same_thread": False},
)


class User(Base):
    __tablename__ = "users"

    id = Column(Integer, primary_key=True)
    name = Column(String)


Base.metadata.create_all(engine)  # Create tables

将 SQLAdmin 集成到 FastAPI 应用程序中:

from fastapi import FastAPI
from sqladmin import Admin, ModelView


app = FastAPI()
admin = Admin(app, engine)


class UserAdmin(ModelView, model=User):
    column_list = [User.id, User.name]


admin.add_view(UserAdmin)

SQLAdmin 一起使用 Starlette:

from sqladmin import Admin, ModelView
from starlette.applications import Starlette


app = Starlette()
admin = Admin(app, engine)


class UserAdmin(ModelView, model=User):
    column_list = [User.id, User.name]


admin.add_view(UserAdmin)

现在/admin 用浏览器访问就可以看到 SQLAdmin 界面了。

配置

权限

可以为此模型配置一些常规权限。可以使用以下选项:

  • can_create:模型是否可以通过 SQLAdmin 创建新实例。默认值为 True。
  • can_edit:是否可以通过 SQLAdmin 编辑模型实例。默认值为 True。
  • can_delete:是否可以通过 SQLAdmin 删除模型实例。默认值为 True。
  • can_view_details:是否可以通过 SQLAdmin 查看模型实例详细信息。默认值为 True。
  • can_export:列表页是否可以导出模型数据。默认值为 True。
class UserAdmin(ModelView, model=User):
    can_create = True
    can_edit = True
    can_delete = False
    can_view_details = True

元数据

模型的元数据。选项有:

  • name:该模型的显示名称。默认值是类名。
  • name_plural:显示该型号的复数名称。默认值为类名 + s。
  • icon:在管理中显示该模型的图标。仅支持 FontAwesome 名称。
class UserAdmin(ModelView, model=User):
    name = "User"
    name_plural = "Users"
    icon = "fa-solid fa-user"

使用自定义视图

向现有 SQLAdmin 视图添加自定义视图,例如创建仪表板、显示自定义信息或添加新表单。可以使用 BaseViewSQLAdmin 中包含的。以下是添加自定义视图的示例:

from sqladmin import BaseView, expose

class ReportView(BaseView):
    name = "Report Page"
    icon = "fa-chart-line"

    @expose("/report", methods=["GET"])
    def report_page(self, request):
        return self.templates.TemplateResponse(
            "report.html",
            context={"request": request},
        )

admin.add_view(ReportView)

templates 这将假设当前项目中有一个目录,并且 report.html 在该目录中创建了一个。

数据库访问

上面的示例非常基本,在自定义视图中访问数据库和 SQLAlchemy 模型。可以使用 sessionmaker 与 SQLAdmin 相同的方式来执行此操作:

from sqlalchemy import Column, Integer, String, select, func
from sqlalchemy.orm import sessionmaker, declarative_base
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
from sqladmin import Admin, BaseView, expose
from starlette.applications import Starlette

Base = declarative_base()
engine = create_async_engine("sqlite+aiosqlite:///test.db")
Session = sessionmaker(bind=engine, class_=AsyncSession)

app = Starlette()
admin = Admin(app=app, engine=engine)


class User(Base):
    __tablename__ = "users"

    id = Column(Integer, primary_key=True)
    name = Column(String(length=16))


class ReportView(BaseView):
    name = "Report Page"
    icon = "fa-chart-line"

    @expose("/report", methods=["GET"])
    async def report_page(self, request):
        # async with engine.begin() as conn:
        #     await conn.run_sync(Base.metadata.create_all)

        async with Session(expire_on_commit=False) as session:
            stmt = select(func.count(User.id))
            result = await session.execute(stmt)
            users_count = result.scalar_one()

        return self.templates.TemplateResponse(
            "report.html",
            context={"request": request, "users_count": users_count},
        )


admin.add_view(ReportView)

接下来使用以下内容更新目录 report.html 中的文件:templates

{% extends "layout.html" %}
{% block content %}
<div class="col-12">
<div class="card">
    <div class="card-header">
    <h3 class="card-title">User reports</h3>
    </div>
    <div class="card-body border-bottom py-3">
    Users count: {{ users_count }}
    </div>
</div>
</div>
{% endblock %}

现在运行服务器,可以前往/admin/report 并查看用户数量。

截图

灵活的 SQLAlchemy 管理后台灵活的 SQLAlchemy 管理后台

传送门

开源协议:BSD-3-Clause

开源地址:https://github.com/aminalaee/sqladmin

项目合集:https://github.com/RepositorySheet

-END-


原文始发于微信公众号(开源技术专栏):灵活的 SQLAlchemy 管理后台

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/166735.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!