FastAPI CRUD router and repository toolkit.
Project description
fastapi-crud-engine
fastapi-crud-engine là thư viện giúp tạo CRUD API cho FastAPI + SQLAlchemy (async) nhanh hơn, giảm lặp code và tích hợp sẵn nhiều tính năng thường dùng.
Tính năng chính
- Tự sinh CRUD endpoints từ model/schema:
list,get,create,update,patch,delete
- Soft delete + restore
- Filter/search/order/range/in/isnull
- Pagination chuẩn (
page,size) - Bulk create
- Export CSV/XLSX, import CSV/XLSX
- Audit trail
- Cache (memory/redis)
- Rate limit (memory/redis)
- Webhook (HTTP hoặc Celery)
- Hooks trước/sau create/update/delete/restore
- Field-level permissions theo role
Cài đặt
Cài local (khuyến nghị khi phát triển)
pip install -e .
Cài thêm optional dependencies
pip install -e ".[excel,redis,celery]"
Quick Start
from __future__ import annotations
from contextlib import asynccontextmanager
from typing import AsyncGenerator
from fastapi import FastAPI
from pydantic import BaseModel
from sqlalchemy import String
from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
from fastapi_crud_engine.core.filters import FilterSet
from fastapi_crud_engine.core.handlers import register_exception_handlers
from fastapi_crud_engine.core.mixins import SoftDeleteMixin, TimestampMixin
from fastapi_crud_engine.router import CRUDRouter
DATABASE_URL = "sqlite+aiosqlite:///./app.db"
engine = create_async_engine(DATABASE_URL, echo=False)
SessionLocal = async_sessionmaker(engine, expire_on_commit=False, class_=AsyncSession)
class Base(DeclarativeBase):
pass
class User(SoftDeleteMixin, TimestampMixin, Base):
__tablename__ = "users"
id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
email: Mapped[str] = mapped_column(String(255), unique=True, index=True)
role: Mapped[str] = mapped_column(String(50), default="user")
class UserSchema(BaseModel):
id: int | None = None
email: str
role: str
model_config = {"from_attributes": True}
async def get_db() -> AsyncGenerator[AsyncSession, None]:
async with SessionLocal() as session:
yield session
@asynccontextmanager
async def lifespan(app: FastAPI):
async with engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all)
yield
app = FastAPI(lifespan=lifespan)
register_exception_handlers(app)
app.include_router(
CRUDRouter(
model=User,
schema=UserSchema,
db=get_db,
prefix="/users",
soft_delete=True,
filterset=FilterSet(
fields=["role", "email"],
search_fields=["email"],
ordering_fields=["id", "email", "created_at"],
nullable_fields=["deleted_at"],
default_ordering="-id",
),
)
)
Endpoints được tạo
Với prefix="/users":
GET /usersGET /users/{pk}POST /usersPUT /users/{pk}PATCH /users/{pk}DELETE /users/{pk}POST /users/bulkGET /users/export?fmt=csv|xlsxPOST /users/importGET /users/deleted(khisoft_delete=True)POST /users/{pk}/restore(khisoft_delete=True)
Bạn có thể tắt endpoint bằng disable=["import", "bulk", "export", "deleted", "restore"].
Các tham số query phổ biến
GET /users?page=1&size=20
GET /users?role=admin
GET /users?search=john
GET /users?ordering=-created_at,email
GET /users?created_at__gte=2025-01-01&created_at__lte=2025-12-31
GET /users?id__in=1,2,3
GET /users?deleted_at__isnull=true
Bật các feature nâng cao
1. Cache
from fastapi_crud_engine.features.cache import Cache
cache = Cache(ttl=60, backend="memory")
# hoặc backend="redis", redis_url="redis://localhost:6379/0"
router = CRUDRouter(
...,
cache=cache,
cache_endpoints=["list", "get"],
)
2. Rate limit
from fastapi_crud_engine.features.rate_limiter import RateLimiter
router = CRUDRouter(
...,
rate_limit=RateLimiter(requests=100, window=60),
)
3. Hooks
from fastapi_crud_engine.router import CRUDHooks
async def before_create(db, payload):
...
async def after_create(db, obj):
...
router = CRUDRouter(
...,
hooks=CRUDHooks(
before_create=before_create,
after_create=after_create,
),
)
4. Field permissions
from fastapi_crud_engine.core.permissions import FieldPermissions
permissions = FieldPermissions(
hidden_by_default=["password_hash"],
read={"admin": "__all__", "user": ["id", "email", "role"]},
write={"admin": "__all__", "user": ["email"]},
)
router = CRUDRouter(
...,
field_permissions=permissions,
)
Mặc định role được đọc từ request.state.role (fallback là "user").
5. Webhooks
from fastapi_crud_engine.features.webhooks import WebhookConfig, WebhookEndpoint
webhooks = WebhookConfig(
delivery="http", # hoặc "celery"
endpoints=[
WebhookEndpoint(
url="https://example.com/webhook",
events=["user.created", "user.updated"],
secret="your-secret",
)
],
)
router = CRUDRouter(
...,
webhooks=webhooks,
)
Exception handling
CRUDRouter đã map custom exceptions của thư viện sang HTTP response. Nếu bạn gọi trực tiếp repository/service và muốn xử lý đồng nhất toàn app, đăng ký thêm:
from fastapi import FastAPI
from fastapi_crud_engine.core.handlers import register_exception_handlers
app = FastAPI()
register_exception_handlers(app)
Chạy test
pytest
Cấu trúc package
fastapi_crud_engine/router.py: CRUD router + auto endpoint registrationfastapi_crud_engine/repository.py: repository layer cho modelfastapi_crud_engine/core/*: filters, pagination, mixins, permissions, exceptions, auditfastapi_crud_engine/features/*: cache, rate limiter, export/import, webhooks
License
MIT
Project details
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 fastapi_crud_engine-0.1.2.tar.gz.
File metadata
- Download URL: fastapi_crud_engine-0.1.2.tar.gz
- Upload date:
- Size: 35.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3736383cd3d6a727276aa6a232a3f3a2c36251c3fc89b4522220d3febfa6dd1c
|
|
| MD5 |
bf82b7068bc2e3c4618b9a34fe2fb781
|
|
| BLAKE2b-256 |
79a7be10204d144c7f517362086aed8b9c67b192e3e9858f13e58e36e3993f1e
|
File details
Details for the file fastapi_crud_engine-0.1.2-py3-none-any.whl.
File metadata
- Download URL: fastapi_crud_engine-0.1.2-py3-none-any.whl
- Upload date:
- Size: 28.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8192b40d800448f41825bc240462eb8daf1fd9b5435a03428b4ddbe0be85a820
|
|
| MD5 |
922e748950588ae8b3c169a94e5276bb
|
|
| BLAKE2b-256 |
fc981db6b2674ea1b4f5c48bf39e3f9c614da689e641600330f2d7be5aff2af9
|