Auto-generated admin UI for HawkAPI + SQLAlchemy — list, detail, create, edit, delete with no boilerplate
Project description
hawkapi-admin
Auto-generated admin UI for HawkAPI + hawkapi-sqlalchemy models. Drop your model classes in and get list / detail / create / edit / delete views mounted under /admin — no boilerplate, no React, no JSON-schema duplication.
Install
pip install hawkapi-admin
Quickstart
from hawkapi import HawkAPI
from hawkapi_sqlalchemy import Base, TimestampMixin, init_database
from sqlalchemy.orm import Mapped, mapped_column
from hawkapi_admin import Admin, ModelResource, init_admin
class User(Base, TimestampMixin):
__tablename__ = "users"
id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
email: Mapped[str] = mapped_column(unique=True)
name: Mapped[str] = mapped_column(default="")
app = HawkAPI()
init_database(app, url="postgresql+asyncpg://…/myapp")
admin = init_admin(app, title="My App")
admin.register(User) # simplest form
Visit /admin — you get the index page, /admin/user (list), /admin/user/new (create form), /admin/user/{id} (detail), /admin/user/{id}/edit, and POST /admin/user/{id}/delete. All with sane widgets picked from each column's SQLAlchemy type.
Customizing a resource
from hawkapi_admin import ModelResource
admin.register(ModelResource(
model=User,
label="Account",
label_plural="Accounts",
icon="👤",
list_display=("id", "email", "created_at"),
list_search=("email", "name"),
form_fields=("email", "name"),
readonly_fields=("created_at",),
page_size=25,
can_delete=False,
))
| Option | Default | Effect |
|---|---|---|
name |
lowercased class name | URL slug (/admin/<name>) |
label |
class name | Heading on detail / form |
label_plural |
label + "s" |
Nav label & list-page heading |
icon |
"" |
Prepended to nav label |
list_display |
every column | Columns shown on the list page |
list_search |
() |
Columns searched by ?q=... (LIKE) |
form_fields |
every non-PK column | Columns shown in the form |
readonly_fields |
() |
Columns rendered but not editable |
page_size |
50 |
Rows per list page |
can_create / can_update / can_delete |
True |
Toggles the corresponding routes off |
Widgets
hawkapi-admin picks an input widget per column type, automatically:
bool→ checkboxint/float→<input type="number">date/datetime→ matching native inputString(length > 500)→ textareaEnum→<select>with the declared choices- everything else →
<input type="text">
Authentication
The plugin doesn't ship its own auth — it picks up whatever middleware you already attached. Combine with hawkapi-auth and gate the admin prefix:
from hawkapi_auth import requires_scopes
admin = Admin(title="Admin", url_prefix="/admin")
admin.register(User)
admin.attach(app)
@app.middleware("http")
async def gate_admin(request, call_next):
if request.url.path.startswith("/admin"):
# raises 401/403 if the JWT is missing / lacks the scope
await requires_scopes("admin:read")(request)
return await call_next(request)
Theming
The bundled CSS is roughly 60 lines, prefers system colors (light + dark mode), and lives inline in _base.html — copy that template into your own templates/ directory if you want to restyle. Jinja extends "_base.html" keeps working as long as the same blocks (title, content) are defined.
Development
git clone https://github.com/ashimov/hawkapi-admin.git
cd hawkapi-admin
uv sync --extra dev
uv run pytest -q
uv run ruff check . && uv run ruff format --check .
uv run pyright src/
License
MIT.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file hawkapi_admin-0.1.1.tar.gz.
File metadata
- Download URL: hawkapi_admin-0.1.1.tar.gz
- Upload date:
- Size: 37.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
eafc4d364ef8d0042ef5dc735df9cff038186693c574d0faf26ce16f8cbdcb05
|
|
| MD5 |
a85fad5a257993ce57fdd21abaad8357
|
|
| BLAKE2b-256 |
fbfca17dc2889dc2aa3e6440ca6a9d383422157a8122cea0374d574676774c02
|
Provenance
The following attestation bundles were made for hawkapi_admin-0.1.1.tar.gz:
Publisher:
release.yml on ashimov/hawkapi-admin
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hawkapi_admin-0.1.1.tar.gz -
Subject digest:
eafc4d364ef8d0042ef5dc735df9cff038186693c574d0faf26ce16f8cbdcb05 - Sigstore transparency entry: 1553134651
- Sigstore integration time:
-
Permalink:
ashimov/hawkapi-admin@4cabb6d01594b659c0f078b678f01a50bbb80073 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/ashimov
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@4cabb6d01594b659c0f078b678f01a50bbb80073 -
Trigger Event:
release
-
Statement type:
File details
Details for the file hawkapi_admin-0.1.1-py3-none-any.whl.
File metadata
- Download URL: hawkapi_admin-0.1.1-py3-none-any.whl
- Upload date:
- Size: 15.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
12ea2e789186ee6e7328242c11323ce6ad484dd38b0ecff0062e39d61ee16199
|
|
| MD5 |
55481951e0248d5d95f428362771cfe0
|
|
| BLAKE2b-256 |
663811e565aae545fa23bf360bbbc74d97c57e35bdcb1aa22884bd563efa6d49
|
Provenance
The following attestation bundles were made for hawkapi_admin-0.1.1-py3-none-any.whl:
Publisher:
release.yml on ashimov/hawkapi-admin
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hawkapi_admin-0.1.1-py3-none-any.whl -
Subject digest:
12ea2e789186ee6e7328242c11323ce6ad484dd38b0ecff0062e39d61ee16199 - Sigstore transparency entry: 1553134662
- Sigstore integration time:
-
Permalink:
ashimov/hawkapi-admin@4cabb6d01594b659c0f078b678f01a50bbb80073 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/ashimov
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@4cabb6d01594b659c0f078b678f01a50bbb80073 -
Trigger Event:
release
-
Statement type: