Json-admin
Библиотека с реализацией простого интерфейса для управления .json-файлом с настройками приложения.
Установка
uv add json-admin
poetry add json-admin
pip install json-admin
Быстрый старт
from litestar import Litestar
from pydantic import BaseModel, Field
from jsonadmin import Admin, HtmlPage, JsonPage
class AppSettings(BaseModel):
"""Настройки приложения."""
debug: bool = Field(default=False, description="Включает debug-режим")
retries: int = Field(default=3, ge=0, description="Количество повторных попыток")
class FeatureFlags(BaseModel):
"""Настройки флагов."""
use_cache: bool = Field(default=True, description="Включает кеширование")
beta_mode: bool = Field(default=False, description="Включает beta-режим")
app = Litestar(route_handlers=[])
admin = Admin(
app=app,
passwd="super-strong-password",
title="My App Admin",
index="index.html",
login="login.html",
pages=[
HtmlPage(
slug="info",
title="Информация",
icon="fa-solid fa-circle-info",
content="""
<h2>Welcome</h2>
<p>Эта вкладка только для чтения и показывает HTML-блок.</p>
""",
),
JsonPage(
slug="settings",
title="Настройки",
file_path="data/app_settings.json",
model=AppSettings,
icon="fa-solid fa-gear",
sync_mode="migrate",
),
JsonPage(
slug="features",
title="Флаги",
file_path="data/feature_flags.json",
model=FeatureFlags,
icon="fa-solid fa-flag",
sync_mode="migrate",
),
],
base_url="/",
)
После запуска:
GET /покажет форму входа по паролю.- после входа доступны вкладки-страницы с JSON-редактором.
HtmlPage— read-only вкладка с HTML-блоком.contentможет быть: встроенной строкой HTML, путём к.htmlфайлу илиCallable[[], str].- кнопка
Сохранитьвалидирует данные через обязательную Pydantic-модель и сохраняет JSON в файл. sync_mode="create"создаст JSON-файл при старте, если файла нет.sync_mode="migrate"создаст файл при отсутствии или прогонит существующий JSON через модель (заполнит дефолты и уберет лишние поля, если модель это позволяет).- файл создается/мигрируется только если модель может быть успешно валидирована; иначе будет ошибка.
- можно переопределить интерфейс через Jinja-шаблоны в
jsonadmin/html/(по умолчанию) или черезtemplates_dir=.... - для вкладок можно передать
iconс классом Font Awesome, напримерfa-solid fa-gear.
Автообновляемый провайдер JSON-конфига
Если в приложении нужен «живой» конфиг, можно использовать JsonProvider и JsonProxy:
from pydantic import BaseModel, Field
from jsonadmin import JsonProvider, JsonProxy, build_json_model_loader
class AppSettings(BaseModel):
debug: bool = Field(default=False)
retries: int = Field(default=3, ge=0)
settings_provider = JsonProvider(
loader=build_json_model_loader(
model=AppSettings,
file_path="data/app_settings.json",
create_if_missing=True,
),
refresh_interval_sec=5,
)
settings: AppSettings = JsonProxy(settings_provider) # type: ignore[assignment]
# Использование:
if settings.debug:
print(settings.retries)
JsonProvider.value вернет кэш и сам перечитает файл только при истекшем интервале.
JsonProxy делает доступ к полям модели прозрачным (settings.debug, settings.retries и т.д.).
Как с этим работать на практике:
- создайте
loaderчерезbuild_json_model_loader(...); - включите
create_if_missing=True, если файл нужно создавать автоматически из дефолтов модели; - оберните
loaderвJsonProviderи задайтеrefresh_interval_sec; - используйте
JsonProxy, чтобы читать поля как у обычной Pydantic-модели; - для немедленного обновления можно вызвать
settings_provider.reload()илиsettings.reload().
Готовый runnable-пример есть в examples/provider_demo.py:
uv run python examples/provider_demo.py
Скрипт показывает сценарий «фонового» обновления: один таск читает прокси, другой изменяет JSON-файл.
Пример интерфейса
Ниже — короткий визуальный пример того, как выглядит админка:
-
Страница входа:
-
Read-only HTML-вкладка (
HtmlPage): -
Редактирование JSON (вкладка 1):
-
Редактирование JSON (вкладка 2):
Metadata
Release files for json-admin 1.3.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| json_admin-1.3.1.tar.gz | 27.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| json_admin-1.3.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 57.9 kB
Release files / json_admin-1.3.1.tar.gz
| Download URL | json_admin-1.3.1.tar.gz |
|---|---|
| Size | 27.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1d44c16ea901a81af2ce56749f8230886f94cdaa9af12d0d8a541b00a551885f
|
|
BLAKE2b-256 checksum How to use checksums |
6b7f003f3e72c2b0876b3c4a703433d3bf4fad34715ba7af7e1d3fcf01e28f70
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 8, 2026.
Transparency logRelease files / json_admin-1.3.1-py3-none-any.whl
| Download URL | json_admin-1.3.1-py3-none-any.whl |
|---|---|
| Size | 30.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
164fd69b7cef557780eb41a02209b3412324971f98760b31bbd28a343778d162
|
|
BLAKE2b-256 checksum How to use checksums |
6ae4462bf7c6ce7b26b0bdd1f5f1a7f9400634856cf7d43d95258ccb858e77b1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 8, 2026.
Transparency log