这是一个灵活的 SQLAlchemy 管理后台,采用 Tabler 构建 Web 界面,支持集成到 FastAPI 和 Starlette,实现类似 Django 内置的管理后台功能。
特征
-
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 并查看用户数量。
截图
传送门
开源协议:BSD-3-Clause
开源地址:https://github.com/aminalaee/sqladmin
项目合集:https://github.com/RepositorySheet
-END-
原文始发于微信公众号(开源技术专栏):灵活的 SQLAlchemy 管理后台
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/166735.html