FastAPI 和 fastapi-amis-admin:強(qiáng)大而可擴(kuò)展的后臺(tái)管理解決方案!

大家好,我是安果!

我們都知道 Django 生態(tài)豐富,功能強(qiáng)大,適用于中、大型項(xiàng)目,并且自帶了后臺(tái)管理系統(tǒng);而 FastAPI  更適用于構(gòu)建高性能的 API,后臺(tái)管理系統(tǒng)需要另外開(kāi)發(fā)

本篇文章將介紹 FastAPI 結(jié)合 fastapi-amis-admin 快速搭建后臺(tái)管理系統(tǒng)的步驟

fastapi-amis-admin 是一款高性能、高效且易于擴(kuò)展的 FastAPI 管理框架;它受到 django-admin 的啟發(fā),擁有與 django-admin 一樣多的強(qiáng)大功能

項(xiàng)目地址:

https://github.com/amisadmin/fastapi-amis-admin

1、安裝依賴

# 1、更新pip
python3 -m pip install --upgrade pip

# 2、安裝依賴fastapi_amis_admin
pip install fastapi_amis_admin

# 3、安裝數(shù)據(jù)庫(kù)管理依賴
# sqlite
pip install aiosqlite  

# mysql
pip install aiomysql
需要注意的是,fastapi-amis-admin 對(duì) Python 最低兼容版本為 Python3.7,如果安裝了低版本,需要先更新版本

2、基礎(chǔ)使用

這里以 sqlite 和 mysql 為例

sqlite:保存在本地

mysql:連接遠(yuǎn)程數(shù)據(jù)庫(kù)

首先,創(chuàng)建一個(gè) AdminSite 對(duì)象,指定數(shù)據(jù)庫(kù)連接信息

然后,創(chuàng)建數(shù)據(jù)模型對(duì)象(繼承于 SQLModel)映射數(shù)據(jù)庫(kù)中的某張表,定義表名及表字段,配置到后臺(tái)管理(繼承于 ModelAdmin)中去

PS:如果數(shù)據(jù)庫(kù)中已經(jīng)存在表,就直接使用;如果不存在,就創(chuàng)建一張新的表

接著,創(chuàng)建一個(gè) FastAPI 應(yīng)用,使用 AdminSite 對(duì)象進(jìn)行掛載

最后,在初始化事件方法中初始化數(shù)據(jù)庫(kù)表

from fastapi import FastAPI
from sqlmodel import SQLModel
from fastapi_amis_admin.admin.settings import Settings
from fastapi_amis_admin.admin.site import AdminSite
from fastapi_amis_admin.admin import admin
from fastapi_amis_admin.models.fields import Field

# 創(chuàng)建FastAPI應(yīng)用
app = FastAPI()

# 創(chuàng)建AdminSite實(shí)例
# sqlite(默認(rèn))
# site = AdminSite(settings=Settings(database_url_async='sqlite+aiosqlite:///amisadmin.db'))

# Mysql
# username:數(shù)據(jù)庫(kù)配置信息(用戶名)
# password:數(shù)據(jù)庫(kù)配置信息(密碼)
# ip:數(shù)據(jù)庫(kù)配置信息(ip地址)
# port:數(shù)據(jù)庫(kù)配置信息(數(shù)據(jù)庫(kù)端口號(hào))
# dbname:數(shù)據(jù)庫(kù)配置信息(數(shù)據(jù)庫(kù)名)
site = AdminSite(settings=Settings(database_url_async='mysql+aiomysql://username:password@ip:port/dbname'))


# 先創(chuàng)建一個(gè)SQLModel模型,映射數(shù)據(jù)庫(kù)中的表
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')

# 注冊(cè)ModelAdmin
@site.register_admin
class CategoryAdmin(admin.ModelAdmin):
    page_schema = '分類管理'
    # 配置管理模型
    model = Category

# 掛載后臺(tái)管理系統(tǒng)
site.mount_app(app)


# 創(chuàng)建初始化數(shù)據(jù)庫(kù)表
@app.on_event("startup")
async def startup():
    await site.db.async_run_sync(SQLModel.metadata.create_all, is_session=False)


if __name__ == '__main__':
    import uvicorn
    uvicorn.run(app, debug=True)
3、用戶認(rèn)證及權(quán)限配置

通過(guò)上面的步驟,我們發(fā)現(xiàn)后臺(tái)管理系統(tǒng)缺少用戶認(rèn)證及權(quán)限配置

這里推薦使用 FastAPI-User-Auth

項(xiàng)目地址:

https://github.com/amisadmin/fastapi-user-auth

FastAPI-User-Auth 是一個(gè)簡(jiǎn)單而強(qiáng)大的 FastAPI 用戶 RBAC 認(rèn)證授權(quán)庫(kù),基于 FastAPI-Amis-Admin,可以提供可自由擴(kuò)展的可視化管理界面

我們需要先安裝依賴

# 用戶認(rèn)證權(quán)限
pip3 install fastapi-user-auth
我們接著對(duì)上面的代碼進(jìn)行修改(僅需 3 步)

首先,將 AdminSite 替換為其子類 AuthAdminSite,創(chuàng)建一個(gè)后臺(tái)管理授權(quán)對(duì)象

from fastapi_user_auth.site import AuthAdminSite

# 實(shí)例化后臺(tái)管理授權(quán)對(duì)象
site = AuthAdminSite(settings=Settings(database_url_async='mysql+aiomysql://username:password@ip:port/dbname'))
auth = site.auth
然后,根據(jù)創(chuàng)建的 SQLModel 對(duì)象,注冊(cè) ModelAdmin

from fastapi_amis_admin.admin import admin

# 自定義Model
# 表名:custom_model
class CustomModel(SQLModel, table=True):
    __tablename__ = 'custom_model'
    id: int = Field(primary_key=True, nullable=False, unique=True)
    name: str = Field(title="名稱", max_length=100)
    url: str = Field(max_length=1000, title="URL地址")

# 注冊(cè)ModelAdmin
@site.register_admin
class CustomAdmin(admin.ModelAdmin):
    page_schema = '自定義表'
    model = CustomModel
最后,在初始化事件中初始化數(shù)據(jù)庫(kù)表的同時(shí),創(chuàng)建一個(gè)默認(rèn)的管理員

PS:默認(rèn)的管理員賬號(hào)密碼是 admin/admin,可以自行修改密碼或者創(chuàng)建賬號(hào)及權(quán)限設(shè)置

from fastapi_amis_admin.admin import admin

# 創(chuàng)建初始化數(shù)據(jù)庫(kù)表
@app.on_event("startup")
async def startup():
    await site.db.async_run_sync(SQLModel.metadata.create_all, is_session=False)
    await auth.create_role_user(role_key='admin')
4、部署問(wèn)題

在部署到服務(wù)器時(shí),可能會(huì)遇到 urllib3 不兼容的問(wèn)題,我們只需要安裝特定版本的 urllib3 即可

# 可能遇到的問(wèn)題
urllib3 v2.0 only supports OpenSSL 1.1.1+, currently the 'ssl' module is compiled with OpenSSL 1.0.2k-fips  26 Jan 2017.

# 解決方案
# 安裝urllib特定版本
pip3 install urllib3==1.26.6





作者:星安果


歡迎關(guān)注微信公眾號(hào) :AirPython