Flask-Admin: auto CRUD views, four ORM backends, and extras you have to ask for
Simple and extensible administrative interface framework for Flask
At a glance
- What is it?
- A Pallets-Eco extension that turns models into admin views, where the model layer and the storage backends live in optional extras rather than the base package, and authentication is left to your application.
- Who is it for?
- Flask-Admin fits a Flask application that already has a model layer and wants an internal admin surface quickly, with someone on the team willing to write the views that a bespoke panel would otherwise demand. A project that needs authentication on day one has to wire it in itself, and one that needs object storage access or image handling has to install those extras first.
- Can I use it commercially?
- Yes. BSD-3-Clause is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository received new commits within the last day.
- What is it written in?
- Mainly Python, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on November 14, 2026, and from our analysis. They are not legal advice.
Star history
- pallets-eco/flask-admin6,074 ★ · +7
| Repository | 2026-09-23 | 2026-11-14 |
|---|---|---|
| pallets-eco/flask-admin | 6.1k | 6.1k |
7 Stars in the last 52 days, measured from the daily GitHub snapshot. Compare with other projects
Editorial analysis
Views are generated per model, and the result belongs to you
The starting point is your models. Flask-Admin creates auto-generated CRUD views for each one, which is why a small application comes together quickly, and why a large one ends up with hand written screens: forms and views can be customized as the need arises.
The inspiration is django-admin, but the implementation is described as giving the developer total control over the look, feel, functionality, and user experience of the result. That claim is visible in the example tree rather than in prose. `examples/simple/` is the bare case, `examples/sqla/` is the SQLAlchemy case, `examples/methodview/` shows a view written from scratch, and `examples/multiple_admin_instances/` shows more than one admin object mounted in the same application. `examples/custom_layout/` changes the surrounding page. The lesson in the directory names is that the generated view is a starting point with an escape hatch, not a contract.
Four ORMs are supported and none of them ship in the install
SQLAlchemy, pymongo, MongoEngine, and Peewee are all listed as supported out of the box, and the phrase means the integration code exists, not that the libraries are installed. The base install is `pip install flask-admin`, and the declared dependencies are Flask, Jinja2, MarkupSafe, Werkzeug, and WTForms. No ORM, no driver, no database library appears in that list.
Each ORM has its own extra, and the SQLAlchemy path has three of them: `sqlalchemy` pulls Flask-SQLAlchemy 3 or newer with SQLAlchemy 1.4 or newer, `sqlalchemy-lite` pulls Flask-SQLAlchemy-Lite, and `sqlalchemy-with-utils` adds SQLAlchemy-Utils, SQLAlchemy Citext, colour, email-validator, and Arrow on top of the base SQLAlchemy extra. So a plain install gives you the view layer with nothing to bind a model to.
Storage, images, exports, and Redis are separate extras too
The feature list mentions a simple file management interface and a Redis client console. The Redis console's client library is an extra in the project metadata, and so are the S3 and Azure Blob storage backends, image handling and export.
s3 = ["boto3>=1.33"]
azure-blob-storage = ["azure-storage-blob>=12.0.0"]
images = ["pillow>=10.0.0"]
export = ["tablib>=3.0.0"]
rediscli = ["redis>=4.0.0"]Read that as a capability map. Without `s3` there is no boto3 in the environment, so an S3-backed column has nothing to talk to. Without `images` there is no Pillow, so image handling in a form is yours to build. Without `export` there is no tablib behind an export action. The `examples/s3/` and `examples/azure_blob_storage/` folders show what those two extras are meant to unlock, and `examples/rediscli/` shows the Redis console path.
Authentication is not part of the core install
An admin surface without a login is an open door, and the package does not include the door. Nothing in the declared dependencies handles users or sessions, and there is no auth extra in the metadata alongside the storage and ORM extras.
What exists instead is work in the example tree: `examples/auth/` and `examples/auth_flask_login/`, two separate folders for two approaches to the same problem. That pairing tells you the wiring is expected to be application code, with the login choice left to the surrounding project rather than chosen for you.
The practical order of work follows from this. Install the core, add the ORM extra for your stack, decide how a signed-in administrator is identified, and only then start modelling screens. Reversing that order produces views with no one behind them.
Python 3.10 sets the floor and the classifier list stops at 3.14
The package metadata states `requires-python = ">=3.11"`, and the classifier list names 3.11, 3.12, 3.13, 3.14, and 3.15 individually. The floor is enforced by the installer. The ceiling is not, since `>=3.11` admits anything newer, and the newest version named in the classifiers is 3.15.
The trove classifiers also record the project's own position: `Development Status :: 5 - Production/Stable`, `Environment :: Web Environment`, `Operating System :: OS Independent`, and a BSD license file.
For contributors there is also a `.python-version` file at the root of the repository, which records the interpreter used for development work rather than the range the package supports.
uv sync without an extra leaves you an admin with no model layer
The contributor path is short and has one trap in it. Clone the repository, change into it, and run `uv sync`. The stated effect of that single command is to install Flask-Admin without any of the optional extras, which the README names as the sqlalchemy and mongoengine support among them.
cd flask-admin
uv sync
uv sync --extra all
pre-commit installThe third line is the one that matters if you intend to run the examples or the suite: `--extra all` pulls every extra defined in the project metadata, not just the ORM you happen to use. Hooks come last, and a `.pre-commit-config.yaml` at the root is what they read. Contributors working on the text of the interface take a narrower route later on, with the docs dependency group rather than the full set.
An example is a directory you change into, and it serves on port 5000
There are around twenty example directories, each a self contained target rather than a snippet to paste. Running the SQLAlchemy one is a three step sequence: clone, change into the example folder, and run the entry point through `uv`, which handles the environment and dependencies. The app then answers on `http://localhost:5000`.
git clone https://github.com/pallets-eco/flask-admin.git
cd flask-admin/examples/sqla
uv run main.pyEvery example manages its dependencies with `uv`, which is why the same command works in each folder. What an example cannot do is reach your application. It runs its own environment, its own models, and its own configuration, so anything you borrow has to be copied into your own tree and adapted. Treat the folders as reference implementations rather than as a starter project.
The suite has four entry points and the docker one starts three services
Tests run under pytest, and the way you invoke them decides how much of the matrix you get. `uv run pytest` runs the suite against the default Python installation. `uv run tox` runs it against every supported Python version and performs the other checks that CI performs. Two Makefile targets cover the case where you are not inside a devcontainer: `make test-in-docker` starts the devcontainer compose configuration, which brings up postgres, azurite, and mongo, and `make tox-in-docker` runs the full suite including the CI checks.
Documentation is generated from the `.rst` files in the `doc/` folder, built locally with `tox -e docs`, and served from `flask-admin.readthedocs.io`. Text changes and translation updates travel through the `babel/` folder on two different paths: a developer who changed interface text syncs the docs group and runs `./babel.sh --update`, while a translator who updated `.po` or `.mo` files enters `babel/` and runs `./babel.sh`. Localization itself needs Flask-Babel installed separately, and Bootstrap, Select2, and Bootswatch come from outside the project.
Editorial conclusion
Flask-Admin fits a Flask application that already has a model layer and wants an internal admin surface quickly, with someone on the team willing to write the views that a bespoke panel would otherwise demand. A project that needs authentication on day one has to wire it in itself, and one that needs object storage access or image handling has to install those extras first. Before committing, check that your Python version clears 3.11, that the ORM you use has an extra that matches your actual driver, and that your content editor tooling matches what the views render.
Frequently asked questions
What is Flask-Admin used for?
It is a Flask extension that adds admin interfaces to an application, taking its inspiration from django-admin while leaving the look, feel, and behavior of the result under developer control. Out of the box it generates CRUD views for your models and also offers a file management interface and a Redis client console, with integrations for SQLAlchemy, pymongo, MongoEngine, and Peewee.
How do I use Flask-Admin with my own models?
Install the core with `pip install flask-admin`, then add the extra that matches your stack, since SQLAlchemy, pymongo, MongoEngine, and Peewee are packaged separately from the core. Register the admin against your application and it creates CRUD views for each model, which you can then customize as forms and views need changing.
How does Flask-Admin compare with Django admin?
Flask-Admin is explicitly inspired by the django-admin package, but is implemented so the developer keeps total control over the look, feel, functionality, and user experience. It is a Flask extension rather than part of a Django project, and its integrations are scoped to Flask.
What are the alternatives to Flask-Admin?
The project names only django-admin as the package it takes inspiration from, and it does not enumerate competing admin frameworks. The closest comparison inside its own documentation is the example folders, which show the range from generated views in `examples/simple/` to hand written ones in `examples/methodview/`.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/pallets-eco-flask-admin)Star history chart for your README
[](https://hysenlabs.com/projects/pallets-eco-flask-admin)Was this useful?