FastAPI-JSONAPI
FastAPI-JSONAPI is a FastAPI extension for building REST APIs. Implementation of a strong specification JSONAPI 1.0. This framework is designed to quickly build REST APIs and fit the complexity of real life projects with legacy data and multiple data storages.
Architecture
Install
pip install FastAPI-JSONAPI
A minimal API
Create a test.py file and copy the following code into it
import sys
from collections.abc import AsyncIterator
from contextlib import asynccontextmanager
from pathlib import Path
from typing import Any, ClassVar, Optional
from typing import Union
import uvicorn
from fastapi import Depends, FastAPI
from fastapi.responses import ORJSONResponse as JSONResponse
from pydantic import ConfigDict
from sqlalchemy.engine import URL
from sqlalchemy.engine import make_url
from sqlalchemy.ext.asyncio import AsyncEngine, AsyncSession, async_sessionmaker, create_async_engine
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
from fastapi_jsonapi import ApplicationBuilder
from fastapi_jsonapi.misc.sqla.generics.base import ViewBaseGeneric
from fastapi_jsonapi.schema_base import BaseModel
from fastapi_jsonapi.views import ViewBase, Operation, OperationConfig
CURRENT_DIR = Path(__file__).resolve().parent
sys.path.append(f"{CURRENT_DIR.parent.parent}")
class DB:
def __init__(
self,
url: Union[str, URL],
echo: bool = False,
echo_pool: bool = False,
):
self.engine: AsyncEngine = create_async_engine(
url=url,
echo=echo,
echo_pool=echo_pool,
)
self.session_maker: async_sessionmaker[AsyncSession] = async_sessionmaker(
autocommit=False,
bind=self.engine,
expire_on_commit=False,
)
async def dispose(self):
await self.engine.dispose()
async def session(self) -> AsyncIterator[AsyncSession]:
async with self.session_maker() as session:
yield session
db = DB(
url=make_url(f"sqlite+aiosqlite:///{CURRENT_DIR}/db.sqlite3"),
)
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = "users"
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[Optional[str]]
class UserSchema(BaseModel):
"""User base schema."""
model_config = ConfigDict(
from_attributes=True,
)
name: str
class SessionDependency(BaseModel):
model_config = ConfigDict(
arbitrary_types_allowed=True,
)
session: AsyncSession = Depends(db.session)
def session_dependency_handler(view: ViewBase, dto: SessionDependency) -> dict[str, Any]:
return {
"session": dto.session,
}
class UserView(ViewBaseGeneric):
operation_dependencies: ClassVar = {
Operation.ALL: OperationConfig(
dependencies=SessionDependency,
prepare_data_layer_kwargs=session_dependency_handler,
),
}
def add_routes(app: FastAPI):
builder = ApplicationBuilder(app)
builder.add_resource(
path="/users",
tags=["User"],
view=UserView,
schema=UserSchema,
model=User,
resource_type="user",
)
builder.initialize()
# noinspection PyUnusedLocal
@asynccontextmanager
async def lifespan(app: FastAPI):
add_routes(app)
async with db.engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all)
yield
await db.dispose()
app = FastAPI(
title="FastAPI and SQLAlchemy",
lifespan=lifespan,
debug=True,
default_response_class=JSONResponse,
docs_url="/docs",
openapi_url="/openapi.json",
)
if __name__ == "__main__":
uvicorn.run(
app,
host="0.0.0.0",
port=8080,
)
This example provides the following API structure:
| URL | method | endpoint | Usage |
|---|---|---|---|
/users/ |
GET | user_list | Get a collection of users |
/users/ |
POST | user_list | Create a user |
/users/ |
DELETE | user_list | Delete users |
/users/{obj_id}/ |
GET | user_detail | Get user details |
/users/{obj_id}/ |
PATCH | user_detail | Update a user |
/users/{obj_id}/ |
DELETE | user_detail | Delete a user |
/operations/ |
POST | atomic | Create, update, delete users |
Release files for FastAPI-JSONAPI 3.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| fastapi_jsonapi-3.0.0.tar.gz | 53.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| fastapi_jsonapi-3.0.0-py2.py3-none-any.whl | Python 2, Python 3 | none | any | Details |
Total release size: 117.9 kB
Release files / fastapi_jsonapi-3.0.0.tar.gz
| Download URL | fastapi_jsonapi-3.0.0.tar.gz |
|---|---|
| Size | 53.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0aad95320c7e5ce0b685d12e5bf48c2bd130e43b34d1c9ede8fe2176f0dc5fb8
|
|
BLAKE2b-256 checksum How to use checksums |
9b182690d07da5e7246fd790433981b30da3053d7e4a5a21eb042a5765ac1618
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Release files / fastapi_jsonapi-3.0.0-py2.py3-none-any.whl
| Download URL | fastapi_jsonapi-3.0.0-py2.py3-none-any.whl |
|---|---|
| Size | 64.1 kB |
| Tags | Python 2 Python 3 |
|
SHA-256 checksum How to use checksums |
f0ca361181a446ecc2917e15b5b979bbfbcb8d6c2b948b73d6573124cb8e5735
|
|
BLAKE2b-256 checksum How to use checksums |
a4eec4a67cad01be70fbe25401d88319fa8c16e904814b5a4379e4c4a2bce439
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|