{"id":25897068,"url":"https://github.com/igorbenav/crudadmin","last_synced_at":"2025-03-02T23:17:47.022Z","repository":{"id":275685233,"uuid":"799684559","full_name":"igorbenav/crudadmin","owner":"igorbenav","description":"Modern admin interface for FastAPI with built-in authentication, event tracking, and security features","archived":false,"fork":false,"pushed_at":"2025-02-19T05:03:34.000Z","size":1340,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-02T03:36:07.029Z","etag":null,"topics":["admin","admin-dashboard","admin-panel","backend","crud","fastapi","pydantic","pydantic-v2","python","sqlalchemy"],"latest_commit_sha":null,"homepage":"https://igorbenav.github.io/crudadmin/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/igorbenav.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"igorbenav"}},"created_at":"2024-05-12T21:24:43.000Z","updated_at":"2025-02-19T05:02:30.000Z","dependencies_parsed_at":"2025-02-04T02:31:18.383Z","dependency_job_id":"b256b5a7-6c81-4d63-a852-a351e49fdef3","html_url":"https://github.com/igorbenav/crudadmin","commit_stats":null,"previous_names":["igorbenav/crudadmin"],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/igorbenav%2Fcrudadmin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/igorbenav%2Fcrudadmin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/igorbenav%2Fcrudadmin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/igorbenav%2Fcrudadmin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/igorbenav","download_url":"https://codeload.github.com/igorbenav/crudadmin/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241582556,"owners_count":19985846,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["admin","admin-dashboard","admin-panel","backend","crud","fastapi","pydantic","pydantic-v2","python","sqlalchemy"],"created_at":"2025-03-02T23:17:45.147Z","updated_at":"2025-03-02T23:17:47.016Z","avatar_url":"https://github.com/igorbenav.png","language":"Python","funding_links":["https://github.com/sponsors/igorbenav"],"categories":[],"sub_categories":[],"readme":"# CRUDAdmin\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://igorbenav.github.io/crudadmin/\"\u003e\n    \u003cimg src=\"docs/assets/CRUDAdmin.png\" alt=\"CRUDAdmin logo\" width=\"45%\" height=\"auto\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ci\u003eModern admin interface for FastAPI with built-in authentication, event tracking, and security features\u003c/i\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n\u003ca href=\"https://pypi.org/project/crudadmin\"\u003e\n  \u003cimg src=\"https://img.shields.io/pypi/v/crudadmin?color=%2334D058\u0026label=pypi%20package\" alt=\"Package version\"/\u003e\n\u003c/a\u003e\n\u003ca href=\"https://pypi.org/project/crudadmin\"\u003e\n  \u003cimg src=\"https://img.shields.io/pypi/pyversions/crudadmin.svg?color=%2334D058\" alt=\"Supported Python versions\"/\u003e\n\u003c/a\u003e\n\u003c/p\u003e\n\n\u003chr\u003e\n\u003cp align=\"justify\"\u003e\n\u003cb\u003eCRUDAdmin\u003c/b\u003e is a robust admin interface generator for \u003cb\u003eFastAPI\u003c/b\u003e applications, offering secure authentication, comprehensive event tracking, and essential monitoring features. Built on top of FastCRUD and SQLAlchemy, it helps you create production-ready admin panels with minimal configuration.\n\u003c/p\u003e\n\n\u003cp\u003e\u003cb\u003eDocumentation\u003c/b\u003e: \u003ca href=\"https://igorbenav.github.io/crudadmin/\"\u003ehttps://igorbenav.github.io/crudadmin/\u003c/a\u003e\u003c/p\u003e\n\n\u003e [!WARNING]  \n\u003e CRUDAdmin is still experimental.\n\n\u003chr\u003e\n\n## Features\n\n- 🔒 **Session-based Authentication**: Secure session management with inactivity timeouts and concurrent session limits\n- 🛡️ **Built-in Security**: IP restrictions, HTTPS enforcement, and secure cookie handling\n- 📝 **Event Tracking**: Comprehensive audit logs for all admin actions with user attribution\n- 🏥 **Health Monitoring**: Real-time system status dashboard with key metrics\n- 📊 **Auto-generated Interface**: Creates admin UI directly from your SQLAlchemy models\n- 🔍 **Smart Filtering**: Type-aware field filtering and efficient search\n- 🌗 **Modern UI**: Clean interface with dark/light theme support\n\n## Requirements\n\nBefore installing CRUDAdmin, ensure you have:\n\n- **FastAPI**: Latest version for the web framework\n- **SQLAlchemy**: Version 2.0+ for database operations\n- **Pydantic**: Version 2.0+ for data validation\n\n## Installing\n\n```sh\npip install crudadmin\n```\n\nOr using poetry:\n\n```sh\npoetry add crudadmin\n```\n\n## Usage\n\nCRUDAdmin offers a straightforward way to create admin interfaces. Here's how to get started:\n\n### Define Your Models and Schemas\n\n**models.py**\n```python\nfrom sqlalchemy.orm import DeclarativeBase\nfrom sqlalchemy import Column, Integer, String\n\nclass Base(DeclarativeBase):\n    pass\n\nclass User(Base):\n    __tablename__ = \"users\"\n    id = Column(Integer, primary_key=True)\n    username = Column(String, unique=True)\n    email = Column(String)\n    role = Column(String)\n```\n\n**schemas.py**\n```python\nfrom pydantic import BaseModel, EmailStr\n\nclass UserCreate(BaseModel):\n    username: str\n    email: EmailStr\n    role: str = \"user\"\n\nclass UserUpdate(BaseModel):\n    email: EmailStr | None = None\n    role: str | None = None\n```\n\n### Set Up the Admin Interface\n\n**main.py**\n```python\nfrom contextlib import asynccontextmanager\nfrom fastapi import FastAPI\nfrom sqlalchemy.ext.asyncio import AsyncSession, create_async_engine\nfrom crudadmin import CRUDAdmin\nimport os\n\n# Database setup\nengine = create_async_engine(\"sqlite+aiosqlite:///app.db\")\nsession = AsyncSession(engine)\n\n# Create admin interface\nadmin = CRUDAdmin(\n    session=session,\n    SECRET_KEY=os.environ.get(\"ADMIN_SECRET_KEY\"),\n    initial_admin={\n        \"username\": \"admin\",\n        \"password\": \"secure_password123\"\n    }\n)\n\n# Add models to admin\nadmin.add_view(\n    model=User,\n    create_schema=UserCreate,\n    update_schema=UserUpdate,\n    allowed_actions={\"view\", \"create\", \"update\"}\n)\n\n# Setup FastAPI with proper initialization\n@asynccontextmanager\nasync def lifespan(app: FastAPI):\n    # Initialize database tables\n    async with engine.begin() as conn:\n        await conn.run_sync(Base.metadata.create_all)\n    \n    # Initialize admin interface\n    await admin.initialize()\n    yield\n\n# Create and mount the app\napp = FastAPI(lifespan=lifespan)\napp.mount(\"/admin\", admin.app)\n```\n\n### Enable Event Tracking\n\n```python\nadmin = CRUDAdmin(\n    session=session,\n    SECRET_KEY=SECRET_KEY,\n    track_events=True,\n    admin_db_url=\"postgresql+asyncpg://user:pass@localhost/admin_logs\"\n)\n\n@asynccontextmanager\nasync def lifespan(app: FastAPI):\n    async with engine.begin() as conn:\n        await conn.run_sync(Base.metadata.create_all)\n    await admin.initialize()  # Creates event tracking tables\n    yield\n```\n\n### Configure Security Features\n\n```python\nadmin = CRUDAdmin(\n    session=session,\n    SECRET_KEY=SECRET_KEY,\n    # Security settings\n    allowed_ips=[\"10.0.0.1\"],\n    allowed_networks=[\"192.168.1.0/24\"],\n    secure_cookies=True,\n    enforce_https=True,\n    # Session settings\n    max_sessions_per_user=5,\n    session_timeout_minutes=30\n)\n\n@asynccontextmanager\nasync def lifespan(app: FastAPI):\n    async with engine.begin() as conn:\n        await conn.run_sync(Base.metadata.create_all)\n    await admin.initialize()  # Initializes security features\n    yield\n```\n\n## Current Limitations (coming soon)\n\n- No file upload support yet\n- No custom admin views (model-based only)\n- No custom field widgets\n- No SQLAlchemy relationship support\n- No export functionality\n\n## Similar Projects\n\n- **[Django Admin](https://docs.djangoproject.com/en/stable/ref/contrib/admin/)**: The inspiration for this project\n- **[Flask-Admin](https://flask-admin.readthedocs.io/)**: Similar project for Flask\n- **[Sqladmin](https://github.com/aminalaee/sqladmin)**: Another FastAPI admin interface\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## Contact\n\nIgor Benav – [@igorbenav](https://x.com/igorbenav) – igormagalhaesr@gmail.com\n[github.com/igorbenav](https://github.com/igorbenav/)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Figorbenav%2Fcrudadmin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Figorbenav%2Fcrudadmin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Figorbenav%2Fcrudadmin/lists"}