Мы все знаем, что Django имеет богатую экосистему и мощные функции, подходит для средних и крупных проектов и поставляется с собственной системой управления серверной частью, в то время как FastAPI больше подходит для создания высокопроизводительных API, и система управления серверной частью должна быть такой; разрабатывается отдельно.
В этой статье будут представлены шаги по быстрому созданию внутренней системы управления с использованием FastAPI в сочетании с fastapi-amis-admin.
fastapi-amis-admin — это высокопроизводительная, эффективная и легко расширяемая среда управления FastAPI, созданная на основе django-admin и имеющая столько же мощных функций, как и django-admin;
Адрес проекта:
https://github.com/amisadmin/fastapi-amis-admin
1. Установите зависимости
# 1. Обновить пип
python3 -m pip install --upgrade pip
# 2. Установите зависимость fastapi_amis_admin
pip install fastapi_amis_admin
# 3. Установите зависимости базы данных
# sqlite
pip install aiosqlite
# mysql
pip install aiomysql
Следует отметить, что минимальной совместимой версией Python для fastapi-amis-admin является Python3.7. Если установлена более ранняя версия, вам необходимо сначала обновить ее.
2. Основное использование
Здесь мы возьмем sqlite и mysql в качестве примеров.
sqlite: сохранить локально
MySQL: подключиться к удаленной базе данных
Сначала создайте объект AdminSite и укажите информацию о подключении к базе данных.
Затем создайте объект модели данных (унаследованный от SQLModel) для сопоставления таблицы в базе данных, определите имя таблицы и поля таблицы и настройте его в фоновом управлении (унаследованном от ModelAdmin).
PS: Если таблица уже существует в базе данных, используйте ее напрямую, если она не существует, создайте новую таблицу.
Затем создайте приложение FastAPI и используйте объект AdminSite для его монтирования.
Наконец, инициализируйте таблицу базы данных в методе события инициализации.
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
# Создать приложение FastAPI
app = FastAPI()
# Создать экземпляр AdminSite
# sqlite (по умолчанию)
# site = AdminSite(settings=Settings(database_url_async='sqlite+aiosqlite:///amisadmin.db'))
# Mysql
# имя пользователя: информация о конфигурации базы данных (имя пользователя)
# пароль: информация о конфигурации базы данных (пароль)
# ip: информация о конфигурации базы данных (IP-адрес)
# порт: информация о конфигурации базы данных (номер порта базы данных)
# dbname: информация о конфигурации базы данных (имя базы данных)
site = AdminSite(settings=Settings(database_url_async='mysql+aiomysql://username:password@ip:port/dbname'))
# Сначала создайте модель SQLModel для сопоставления таблиц в базе данных.
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')
# Регистрация администратора модели
@site.register_admin
class CategoryAdmin(admin.ModelAdmin):
page_schema = 'Классификацияуправлять' # Настройка модели управления
model = Category
# Гора За кулисамиуправлятьсистема
site.mount_app(app)
# Создать исходную таблицу базы данных
@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. Аутентификация пользователя и настройка разрешений.
Выполнив описанные выше шаги, мы обнаружили, что в серверной системе управления отсутствует аутентификация пользователей и настройка разрешений.
Здесь рекомендуется использовать FastAPI-User-Auth.
Адрес проекта:
https://github.com/amisadmin/fastapi-user-auth
FastAPI-User-Auth — это простая и мощная библиотека аутентификации и авторизации пользователей FastAPI RBAC. Основанная на FastAPI-Amis-Admin, она может предоставить свободно масштабируемый интерфейс визуального управления.
Сначала нам нужно установить зависимости
# центр аутентификации пользователя
pip3 install fastapi-user-auth
Затем мы модифицируем приведенный выше код (требуется всего 3 шага)
Сначала замените AdminSite его подклассом AuthAdminSite и создайте объект авторизации фонового управления.
from fastapi_user_auth.site import AuthAdminSite
# Создать экземпляр кулисамиуправлять Авторизоватьвернослон
site = AuthAdminSite(settings=Settings(database_url_async='mysql+aiomysql://username:password@ip:port/dbname'))
auth = site.auth
Затем на основе созданного объекта SQLModel зарегистрируйте ModelAdmin.
from fastapi_amis_admin.admin import admin
# Пользовательская модель
# Имя таблицы: custom_model
class CustomModel(SQLModel, table=True):
__tablename__ = 'custom_model'
id: int = Field(primary_key=True, nullable=False, unique=True)
name: str = Поле(title="имя", max_length=100)
url: str = Field(max_length=1000, title="URL-адрес")
# Регистрация администратора модели
@site.register_admin
class CustomAdmin(admin.ModelAdmin):
page_schema = «Пользовательская таблица»
model = CustomModel
Наконец, при инициализации таблиц базы данных в событии инициализации создайте администратора по умолчанию.
PS: Пароль учетной записи администратора по умолчанию — admin/admin. Вы можете изменить пароль или создать учетную запись и настройки разрешений самостоятельно.
from fastapi_amis_admin.admin import admin
# Создать исходную таблицу базы данных
@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. Проблемы с развертыванием
При развертывании на сервере вы можете столкнуться с проблемами несовместимости urllib3. Нам нужно установить только определенную версию urllib3.
# Возможные проблемы
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
Рекомендуем к прочтению
Как использовать Selenium для сканирования открытых браузеров!