fastadmin


Namefastadmin JSON
Version 0.2.15 PyPI version JSON
download
home_pagehttps://github.com/vsdudakov/fastadmin
SummaryFastAdmin is an easy-to-use Admin Dashboard App for FastAPI/Flask/Django inspired by Django Admin.
upload_time2024-11-20 20:05:51
maintainerNone
docs_urlNone
authorSeva D
requires_python<4.0,>=3.10
licenseMIT
keywords fastapi admin
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            ## Admin Dashboard App for FastAPI/Flask/Django

[![codecov](https://codecov.io/gh/vsdudakov/fastadmin/branch/main/graph/badge.svg?token=RNGX5HOW3T)](https://codecov.io/gh/vsdudakov/fastadmin)
[![License](https://img.shields.io/github/license/vsdudakov/fastadmin)](https://github.com/vsdudakov/fastadmin/blob/master/LICENSE)
[![PyPi](https://badgen.net/pypi/v/fastadmin)](https://pypi.org/project/fastadmin/)
[![Python 3.10](https://img.shields.io/badge/python-3.10-blue.svg)](https://www.python.org/downloads/release/python-3100/)
[![Python 3.11](https://img.shields.io/badge/python-3.11-blue.svg)](https://www.python.org/downloads/release/python-3110/)
[![Python 3.12](https://img.shields.io/badge/python-3.12-blue.svg)](https://www.python.org/downloads/release/python-3120/)

## Screenshots

![SignIn View](https://raw.githubusercontent.com/vsdudakov/fastadmin/main/docs/assets/images/signin.png)
![List View](https://raw.githubusercontent.com/vsdudakov/fastadmin/main/docs/assets/images/list.png)
![Change View](https://raw.githubusercontent.com/vsdudakov/fastadmin/main/docs/assets/images/change.png)

<p align="center">
  <a href="https://twitter.com/intent/tweet?text=Admin%20Dashboard%20For%20FastAPI&url=https://github.com/vsdudakov/fastadmin&hashtags=FastAPI,AdminDashboard">
    <img alt="tweet" src="https://img.shields.io/twitter/url/https/twitter?label=Share%20on%20twitter&style=social" target="_blank" />
  </a>
</p>



## Introduction

  
<a href='https://github.com/vsdudakov/fastadmin' target='_blank'>FastAdmin</a> is an easy-to-use Admin Dashboard App for FastAPI/Django/Flask inspired by Django Admin.














  
FastAdmin was built with relations in mind and admiration for the excellent and popular Django Admin. It's engraved in its design that you may configure your admin dashboard for FastAPI/Django/Flask easiest way.














  
FastAdmin is designed to be minimalistic, functional and yet familiar.


















## Getting Started

  




If you have any questions that are beyond the scope of the documentation, Please feel free to email <a href='mailto:vsdudakov@gmail.com' target='_blank'>us</a>.












### Installation

  


Follow the steps below to setup FastAdmin:












  
Install the package using pip:














  




Note: For zsh and macos use: <code>pip install fastadmin[fastapi,django]</code>










  








```bash

pip install fastadmin[fastapi,django]  # for fastapi with django orm
pip install fastadmin[fastapi,tortoise-orm]  # for fastapi with tortoise orm
pip install fastadmin[fastapi,pony]  # for fastapi with pony orm
pip install fastadmin[fastapi,sqlalchemy]  # for fastapi with sqlalchemy orm
pip install fastadmin[django]  # for django with django orm
pip install fastadmin[django,pony]  # for django with pony orm
pip install fastadmin[flask,sqlalchemy]  # for flask with sqlalchemy

```






  
Install the package using poetry:














  








```bash

poetry add 'fastadmin[fastapi,django]'  # for fastapi with django orm
poetry add 'fastadmin[fastapi,tortoise-orm]'  # for fastapi with tortoise orm
poetry add 'fastadmin[fastapi,pony]'  # for fastapi with pony orm
poetry add 'fastadmin[fastapi,sqlalchemy]'  # for fastapi with sqlalchemy orm
poetry add 'fastadmin[django]'  # for django with django orm
poetry add 'fastadmin[django,pony]'  # for django with pony orm
poetry add 'fastadmin[flask,sqlalchemy]'  # for flask with sqlalchemy

```






  
Configure required settings using virtual environment variables:














  




Note: You can add these variables to .env and use python-dotenv to load them. See all settings <a href='https://vsdudakov.github.io/fastadmin#settings'>here</a>










  








```bash

export ADMIN_USER_MODEL=User
export ADMIN_USER_MODEL_USERNAME_FIELD=username
export ADMIN_SECRET_KEY=secret_key

```







### Quick Tutorial

  


Setup FastAdmin for a framework












  













### FastAPI












```python
from fastapi import FastAPI

from fastadmin import fastapi_app as admin_app

app = FastAPI()

app.mount("/admin", admin_app)

```






### Django












```python
from django.urls import path

from fastadmin import get_django_admin_urls as get_admin_urls
from fastadmin.settings import settings

urlpatterns = [
    path(f"{settings.ADMIN_PREFIX}/", get_admin_urls()),
]

```






### Flask












```python
from flask import Flask

from fastadmin import flask_app as admin_app

app = Flask(__name__)

app.register_blueprint(admin_app, url_prefix="/admin")

```








  


Register ORM models












  













### Tortoise ORM












```python
from uuid import UUID

import bcrypt
from tortoise import fields
from tortoise.models import Model

from fastadmin import TortoiseModelAdmin, register


class User(Model):
    username = fields.CharField(max_length=255, unique=True)
    hash_password = fields.CharField(max_length=255)
    is_superuser = fields.BooleanField(default=False)
    is_active = fields.BooleanField(default=False)

    def __str__(self):
        return self.username


@register(User)
class UserAdmin(TortoiseModelAdmin):
    exclude = ("hash_password",)
    list_display = ("id", "username", "is_superuser", "is_active")
    list_display_links = ("id", "username")
    list_filter = ("id", "username", "is_superuser", "is_active")
    search_fields = ("username",)

    async def authenticate(self, username: str, password: str) -> UUID | int | None:
        user = await User.filter(username=username, is_superuser=True).first()
        if not user:
            return None
        if not bcrypt.checkpw(password.encode(), user.hash_password.encode()):
            return None
        return user.id

```






### Django ORM












```python
from django.db import models

from fastadmin import DjangoModelAdmin, register


class User(models.Model):
    username = models.CharField(max_length=255, unique=True)
    hash_password = models.CharField(max_length=255)
    is_superuser = models.BooleanField(default=False)
    is_active = models.BooleanField(default=False)

    def __str__(self):
        return self.username


@register(User)
class UserAdmin(DjangoModelAdmin):
    exclude = ("hash_password",)
    list_display = ("id", "username", "is_superuser", "is_active")
    list_display_links = ("id", "username")
    list_filter = ("id", "username", "is_superuser", "is_active")
    search_fields = ("username",)

    def authenticate(self, username, password):
        obj = User.objects.filter(username=username, is_superuser=True).first()
        if not obj:
            return None
        if not obj.check_password(password):
            return None
        return obj.id

```






### SQL Alchemy












```python
import bcrypt
from sqlalchemy import Boolean, Integer, String, select
from sqlalchemy.ext.asyncio import async_sessionmaker, create_async_engine
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column

from fastadmin import SqlAlchemyModelAdmin, register

sqlalchemy_engine = create_async_engine(
    "sqlite+aiosqlite:///:memory:",
    echo=True,
)
sqlalchemy_sessionmaker = async_sessionmaker(sqlalchemy_engine, expire_on_commit=False)


class Base(DeclarativeBase):
    pass


class User(Base):
    __tablename__ = "user"

    id: Mapped[int] = mapped_column(Integer, primary_key=True, nullable=False)
    username: Mapped[str] = mapped_column(String(length=255), nullable=False)
    hash_password: Mapped[str] = mapped_column(String(length=255), nullable=False)
    is_superuser: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
    is_active: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)

    def __str__(self):
        return self.username


@register(User, sqlalchemy_sessionmaker=sqlalchemy_sessionmaker)
class UserAdmin(SqlAlchemyModelAdmin):
    exclude = ("hash_password",)
    list_display = ("id", "username", "is_superuser", "is_active")
    list_display_links = ("id", "username")
    list_filter = ("id", "username", "is_superuser", "is_active")
    search_fields = ("username",)

    async def authenticate(self, username, password):
        sessionmaker = self.get_sessionmaker()
        async with sessionmaker() as session:
            query = select(User).filter_by(username=username, password=password, is_superuser=True)
            result = await session.scalars(query)
            user = result.first()
            if not user:
                return None
            if not bcrypt.checkpw(password.encode(), user.hash_password.encode()):
                return None
            return user.id

```






### Pony ORM












```python
import bcrypt
from pony.orm import Database, PrimaryKey, Required, db_session

from fastadmin import PonyORMModelAdmin, register

db = Database()
db.bind(provider="sqlite", filename=":memory:", create_db=True)


class User(db.Entity):  # type: ignore [name-defined]
    _table_ = "user"
    id = PrimaryKey(int, auto=True)
    username = Required(str)
    hash_password = Required(str)
    is_superuser = Required(bool, default=False)
    is_active = Required(bool, default=False)

    def __str__(self):
        return self.username


@register(User)
class UserAdmin(PonyORMModelAdmin):
    exclude = ("hash_password",)
    list_display = ("id", "username", "is_superuser", "is_active")
    list_display_links = ("id", "username")
    list_filter = ("id", "username", "is_superuser", "is_active")
    search_fields = ("username",)

    @db_session
    def authenticate(self, username, password):
        user = next((f for f in self.model_cls.select(username=username, password=password, is_superuser=True)), None)
        if not user:
            return None
        if not bcrypt.checkpw(password.encode(), user.hash_password.encode()):
            return None
        return user.id

```






















## Documentation
See full documentation [here](https://vsdudakov.github.io/fastadmin).

## License
This project is licensed under the MIT License - see the [LICENSE](https://github.com/vsdudakov/fastadmin/blob/main/LICENSE) file for details.
            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/vsdudakov/fastadmin",
    "name": "fastadmin",
    "maintainer": null,
    "docs_url": null,
    "requires_python": "<4.0,>=3.10",
    "maintainer_email": null,
    "keywords": "fastapi, admin",
    "author": "Seva D",
    "author_email": "vsdudakov@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/ab/7c/7c222108a8d684bcefd4e58e9eeb3ff718a2985701cd4dcc5c71a77c7363/fastadmin-0.2.15.tar.gz",
    "platform": null,
    "description": "## Admin Dashboard App for FastAPI/Flask/Django\n\n[![codecov](https://codecov.io/gh/vsdudakov/fastadmin/branch/main/graph/badge.svg?token=RNGX5HOW3T)](https://codecov.io/gh/vsdudakov/fastadmin)\n[![License](https://img.shields.io/github/license/vsdudakov/fastadmin)](https://github.com/vsdudakov/fastadmin/blob/master/LICENSE)\n[![PyPi](https://badgen.net/pypi/v/fastadmin)](https://pypi.org/project/fastadmin/)\n[![Python 3.10](https://img.shields.io/badge/python-3.10-blue.svg)](https://www.python.org/downloads/release/python-3100/)\n[![Python 3.11](https://img.shields.io/badge/python-3.11-blue.svg)](https://www.python.org/downloads/release/python-3110/)\n[![Python 3.12](https://img.shields.io/badge/python-3.12-blue.svg)](https://www.python.org/downloads/release/python-3120/)\n\n## Screenshots\n\n![SignIn View](https://raw.githubusercontent.com/vsdudakov/fastadmin/main/docs/assets/images/signin.png)\n![List View](https://raw.githubusercontent.com/vsdudakov/fastadmin/main/docs/assets/images/list.png)\n![Change View](https://raw.githubusercontent.com/vsdudakov/fastadmin/main/docs/assets/images/change.png)\n\n<p align=\"center\">\n  <a href=\"https://twitter.com/intent/tweet?text=Admin%20Dashboard%20For%20FastAPI&url=https://github.com/vsdudakov/fastadmin&hashtags=FastAPI,AdminDashboard\">\n    <img alt=\"tweet\" src=\"https://img.shields.io/twitter/url/https/twitter?label=Share%20on%20twitter&style=social\" target=\"_blank\" />\n  </a>\n</p>\n\n\n\n## Introduction\n\n  \n<a href='https://github.com/vsdudakov/fastadmin' target='_blank'>FastAdmin</a> is an easy-to-use Admin Dashboard App for FastAPI/Django/Flask inspired by Django Admin.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n  \nFastAdmin was built with relations in mind and admiration for the excellent and popular Django Admin. It's engraved in its design that you may configure your admin dashboard for FastAPI/Django/Flask easiest way.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n  \nFastAdmin is designed to be minimalistic, functional and yet familiar.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n## Getting Started\n\n  \n\n\n\n\nIf you have any questions that are beyond the scope of the documentation, Please feel free to email <a href='mailto:vsdudakov@gmail.com' target='_blank'>us</a>.\n\n\n\n\n\n\n\n\n\n\n\n\n### Installation\n\n  \n\n\nFollow the steps below to setup FastAdmin:\n\n\n\n\n\n\n\n\n\n\n\n\n  \nInstall the package using pip:\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n  \n\n\n\n\nNote: For zsh and macos use: <code>pip install fastadmin[fastapi,django]</code>\n\n\n\n\n\n\n\n\n\n\n  \n\n\n\n\n\n\n\n\n```bash\n\npip install fastadmin[fastapi,django]  # for fastapi with django orm\npip install fastadmin[fastapi,tortoise-orm]  # for fastapi with tortoise orm\npip install fastadmin[fastapi,pony]  # for fastapi with pony orm\npip install fastadmin[fastapi,sqlalchemy]  # for fastapi with sqlalchemy orm\npip install fastadmin[django]  # for django with django orm\npip install fastadmin[django,pony]  # for django with pony orm\npip install fastadmin[flask,sqlalchemy]  # for flask with sqlalchemy\n\n```\n\n\n\n\n\n\n  \nInstall the package using poetry:\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n  \n\n\n\n\n\n\n\n\n```bash\n\npoetry add 'fastadmin[fastapi,django]'  # for fastapi with django orm\npoetry add 'fastadmin[fastapi,tortoise-orm]'  # for fastapi with tortoise orm\npoetry add 'fastadmin[fastapi,pony]'  # for fastapi with pony orm\npoetry add 'fastadmin[fastapi,sqlalchemy]'  # for fastapi with sqlalchemy orm\npoetry add 'fastadmin[django]'  # for django with django orm\npoetry add 'fastadmin[django,pony]'  # for django with pony orm\npoetry add 'fastadmin[flask,sqlalchemy]'  # for flask with sqlalchemy\n\n```\n\n\n\n\n\n\n  \nConfigure required settings using virtual environment variables:\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n  \n\n\n\n\nNote: You can add these variables to .env and use python-dotenv to load them. See all settings <a href='https://vsdudakov.github.io/fastadmin#settings'>here</a>\n\n\n\n\n\n\n\n\n\n\n  \n\n\n\n\n\n\n\n\n```bash\n\nexport ADMIN_USER_MODEL=User\nexport ADMIN_USER_MODEL_USERNAME_FIELD=username\nexport ADMIN_SECRET_KEY=secret_key\n\n```\n\n\n\n\n\n\n\n### Quick Tutorial\n\n  \n\n\nSetup FastAdmin for a framework\n\n\n\n\n\n\n\n\n\n\n\n\n  \n\n\n\n\n\n\n\n\n\n\n\n\n\n### FastAPI\n\n\n\n\n\n\n\n\n\n\n\n\n```python\nfrom fastapi import FastAPI\n\nfrom fastadmin import fastapi_app as admin_app\n\napp = FastAPI()\n\napp.mount(\"/admin\", admin_app)\n\n```\n\n\n\n\n\n\n### Django\n\n\n\n\n\n\n\n\n\n\n\n\n```python\nfrom django.urls import path\n\nfrom fastadmin import get_django_admin_urls as get_admin_urls\nfrom fastadmin.settings import settings\n\nurlpatterns = [\n    path(f\"{settings.ADMIN_PREFIX}/\", get_admin_urls()),\n]\n\n```\n\n\n\n\n\n\n### Flask\n\n\n\n\n\n\n\n\n\n\n\n\n```python\nfrom flask import Flask\n\nfrom fastadmin import flask_app as admin_app\n\napp = Flask(__name__)\n\napp.register_blueprint(admin_app, url_prefix=\"/admin\")\n\n```\n\n\n\n\n\n\n\n\n  \n\n\nRegister ORM models\n\n\n\n\n\n\n\n\n\n\n\n\n  \n\n\n\n\n\n\n\n\n\n\n\n\n\n### Tortoise ORM\n\n\n\n\n\n\n\n\n\n\n\n\n```python\nfrom uuid import UUID\n\nimport bcrypt\nfrom tortoise import fields\nfrom tortoise.models import Model\n\nfrom fastadmin import TortoiseModelAdmin, register\n\n\nclass User(Model):\n    username = fields.CharField(max_length=255, unique=True)\n    hash_password = fields.CharField(max_length=255)\n    is_superuser = fields.BooleanField(default=False)\n    is_active = fields.BooleanField(default=False)\n\n    def __str__(self):\n        return self.username\n\n\n@register(User)\nclass UserAdmin(TortoiseModelAdmin):\n    exclude = (\"hash_password\",)\n    list_display = (\"id\", \"username\", \"is_superuser\", \"is_active\")\n    list_display_links = (\"id\", \"username\")\n    list_filter = (\"id\", \"username\", \"is_superuser\", \"is_active\")\n    search_fields = (\"username\",)\n\n    async def authenticate(self, username: str, password: str) -> UUID | int | None:\n        user = await User.filter(username=username, is_superuser=True).first()\n        if not user:\n            return None\n        if not bcrypt.checkpw(password.encode(), user.hash_password.encode()):\n            return None\n        return user.id\n\n```\n\n\n\n\n\n\n### Django ORM\n\n\n\n\n\n\n\n\n\n\n\n\n```python\nfrom django.db import models\n\nfrom fastadmin import DjangoModelAdmin, register\n\n\nclass User(models.Model):\n    username = models.CharField(max_length=255, unique=True)\n    hash_password = models.CharField(max_length=255)\n    is_superuser = models.BooleanField(default=False)\n    is_active = models.BooleanField(default=False)\n\n    def __str__(self):\n        return self.username\n\n\n@register(User)\nclass UserAdmin(DjangoModelAdmin):\n    exclude = (\"hash_password\",)\n    list_display = (\"id\", \"username\", \"is_superuser\", \"is_active\")\n    list_display_links = (\"id\", \"username\")\n    list_filter = (\"id\", \"username\", \"is_superuser\", \"is_active\")\n    search_fields = (\"username\",)\n\n    def authenticate(self, username, password):\n        obj = User.objects.filter(username=username, is_superuser=True).first()\n        if not obj:\n            return None\n        if not obj.check_password(password):\n            return None\n        return obj.id\n\n```\n\n\n\n\n\n\n### SQL Alchemy\n\n\n\n\n\n\n\n\n\n\n\n\n```python\nimport bcrypt\nfrom sqlalchemy import Boolean, Integer, String, select\nfrom sqlalchemy.ext.asyncio import async_sessionmaker, create_async_engine\nfrom sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column\n\nfrom fastadmin import SqlAlchemyModelAdmin, register\n\nsqlalchemy_engine = create_async_engine(\n    \"sqlite+aiosqlite:///:memory:\",\n    echo=True,\n)\nsqlalchemy_sessionmaker = async_sessionmaker(sqlalchemy_engine, expire_on_commit=False)\n\n\nclass Base(DeclarativeBase):\n    pass\n\n\nclass User(Base):\n    __tablename__ = \"user\"\n\n    id: Mapped[int] = mapped_column(Integer, primary_key=True, nullable=False)\n    username: Mapped[str] = mapped_column(String(length=255), nullable=False)\n    hash_password: Mapped[str] = mapped_column(String(length=255), nullable=False)\n    is_superuser: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)\n    is_active: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)\n\n    def __str__(self):\n        return self.username\n\n\n@register(User, sqlalchemy_sessionmaker=sqlalchemy_sessionmaker)\nclass UserAdmin(SqlAlchemyModelAdmin):\n    exclude = (\"hash_password\",)\n    list_display = (\"id\", \"username\", \"is_superuser\", \"is_active\")\n    list_display_links = (\"id\", \"username\")\n    list_filter = (\"id\", \"username\", \"is_superuser\", \"is_active\")\n    search_fields = (\"username\",)\n\n    async def authenticate(self, username, password):\n        sessionmaker = self.get_sessionmaker()\n        async with sessionmaker() as session:\n            query = select(User).filter_by(username=username, password=password, is_superuser=True)\n            result = await session.scalars(query)\n            user = result.first()\n            if not user:\n                return None\n            if not bcrypt.checkpw(password.encode(), user.hash_password.encode()):\n                return None\n            return user.id\n\n```\n\n\n\n\n\n\n### Pony ORM\n\n\n\n\n\n\n\n\n\n\n\n\n```python\nimport bcrypt\nfrom pony.orm import Database, PrimaryKey, Required, db_session\n\nfrom fastadmin import PonyORMModelAdmin, register\n\ndb = Database()\ndb.bind(provider=\"sqlite\", filename=\":memory:\", create_db=True)\n\n\nclass User(db.Entity):  # type: ignore [name-defined]\n    _table_ = \"user\"\n    id = PrimaryKey(int, auto=True)\n    username = Required(str)\n    hash_password = Required(str)\n    is_superuser = Required(bool, default=False)\n    is_active = Required(bool, default=False)\n\n    def __str__(self):\n        return self.username\n\n\n@register(User)\nclass UserAdmin(PonyORMModelAdmin):\n    exclude = (\"hash_password\",)\n    list_display = (\"id\", \"username\", \"is_superuser\", \"is_active\")\n    list_display_links = (\"id\", \"username\")\n    list_filter = (\"id\", \"username\", \"is_superuser\", \"is_active\")\n    search_fields = (\"username\",)\n\n    @db_session\n    def authenticate(self, username, password):\n        user = next((f for f in self.model_cls.select(username=username, password=password, is_superuser=True)), None)\n        if not user:\n            return None\n        if not bcrypt.checkpw(password.encode(), user.hash_password.encode()):\n            return None\n        return user.id\n\n```\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n## Documentation\nSee full documentation [here](https://vsdudakov.github.io/fastadmin).\n\n## License\nThis project is licensed under the MIT License - see the [LICENSE](https://github.com/vsdudakov/fastadmin/blob/main/LICENSE) file for details.",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "FastAdmin is an easy-to-use Admin Dashboard App for FastAPI/Flask/Django inspired by Django Admin.",
    "version": "0.2.15",
    "project_urls": {
        "Homepage": "https://github.com/vsdudakov/fastadmin",
        "Repository": "https://github.com/vsdudakov/fastadmin"
    },
    "split_keywords": [
        "fastapi",
        " admin"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "4d6a888c1ff8096d4690822770c3c6a30e81f7f24f392474aad25c67ef54680e",
                "md5": "044a2ac306bb48c22856663ee504c9ac",
                "sha256": "4a4ea7f0bc981b3c92422c84d0af9c435c936faac0d37d415a7373cd738cbcf3"
            },
            "downloads": -1,
            "filename": "fastadmin-0.2.15-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "044a2ac306bb48c22856663ee504c9ac",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": "<4.0,>=3.10",
            "size": 1118046,
            "upload_time": "2024-11-20T20:05:49",
            "upload_time_iso_8601": "2024-11-20T20:05:49.689814Z",
            "url": "https://files.pythonhosted.org/packages/4d/6a/888c1ff8096d4690822770c3c6a30e81f7f24f392474aad25c67ef54680e/fastadmin-0.2.15-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "ab7c7c222108a8d684bcefd4e58e9eeb3ff718a2985701cd4dcc5c71a77c7363",
                "md5": "097658a00d02a7108ec60a9cd9a630f5",
                "sha256": "92e32a34ae9ce3268657c0383ee1f6489009055c9e67e780d269ebb8199a00de"
            },
            "downloads": -1,
            "filename": "fastadmin-0.2.15.tar.gz",
            "has_sig": false,
            "md5_digest": "097658a00d02a7108ec60a9cd9a630f5",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": "<4.0,>=3.10",
            "size": 1101989,
            "upload_time": "2024-11-20T20:05:51",
            "upload_time_iso_8601": "2024-11-20T20:05:51.413530Z",
            "url": "https://files.pythonhosted.org/packages/ab/7c/7c222108a8d684bcefd4e58e9eeb3ff718a2985701cd4dcc5c71a77c7363/fastadmin-0.2.15.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-11-20 20:05:51",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "vsdudakov",
    "github_project": "fastadmin",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "fastadmin"
}
        
Elapsed time: 0.36298s