Skip to main content

FastAPI Class Views and utilities

Project description

fastapi-views

Tests Build License Mypy Ruff) Pydantic v2 security: bandit Python Format PyPi

Class-based views, CRUD utilities, and production-ready patterns for FastAPI.

FastAPI Views brings Django REST Framework-style class-based views to FastAPI — without giving up type safety or dependency injection. Define a full CRUD resource by inheriting one class; routes, status codes, and OpenAPI docs are wired up automatically.

Features

  • Class-based viewsView, APIView, ViewSet, and GenericViewSet at three levels of abstraction; mix-in only the actions you need
  • Full CRUD in one classlist, create, retrieve, update, partial_update, destroy with correct HTTP semantics out of the box (201 Created, 204 No Content, Location header, etc.)
  • Generic views with the repository pattern — plug in any data source (SQLAlchemy, Motor, plain dicts) via a simple protocol; no ORM dependency
  • DRF-style filtersModelFilter, OrderingFilter, SearchFilter, PaginationFilter, TokenPaginationFilter, FieldsFilter, and a combined Filter class; built-in SQLAlchemy and Python object resolvers
  • RFC 9457 Problem Details — every error response is machine-readable; built-in classes for the most common cases; custom errors auto-register in the OpenAPI spec
  • Fast Pydantic v2 serializationTypeAdapter cached per schema type avoids the double validation/model instantiation that FastAPI does by default, reducing per-request overhead
  • Server-Sent EventsServerSentEventsAPIView and @sse_route handle framing, content-type, and Pydantic validation automatically
  • WebSocketsWebSocketAPIView handles connection lifecycle, per-class connection tracking, broadcast helpers, and Pydantic validation of binary frames; disconnects are handled gracefully
  • Authentication & authorization — JWT bearer auth (JWTAuth), OAuth2 scope enforcement with hierarchical scopes (OAuth2JWTAuth), Auth0 integration, and constant-time API-key auth (require_api_key); protected routers and JWKS publishing included (optional extras)
  • Internationalization (i18n) — per-request locale detection (query param, cookie, Accept-Language), pluggable translation managers (JSON files, in-memory, or custom), str.format/Jinja2 formatters, and Translatable[str] model fields; built-in error messages are translatable out of the box (optional extra)
  • Async and sync support — every class ships an Async and a synchronous variant; sync endpoints run in a thread pool
  • One-call setupconfigure_app(app) registers error handlers, Prometheus middleware, OpenTelemetry instrumentation, locale detection, request logging, and a request-size limit
  • Prometheus metrics/metrics endpoint with request count, latency histogram, and in-flight requests (optional extra)
  • OpenTelemetry tracingcorrelation_id injected into every error response for easy trace correlation (optional extra)
  • Structured request logging — opt-in console or json request logging via configure_app(log_config=...) (optional extra)
  • Readable OpenAPI operation IDslist_item, create_item, retrieve_item instead of FastAPI's long path-derived defaults
  • CLI — export a static openapi.json / openapi.yaml without starting a server

Documentation: https://asynq-io.github.io/fastapi-views/

Repository: https://github.com/asynq-io/fastapi-views


Installation

pip install fastapi-views

Optional dependencies

Available extensions: uvloop, uvicorn, prometheus, opentelemetry, cli, logging, websockets, jose (JWT auth), auth0 (Auth0 auth), i18n, and standard (a curated bundle).

pip install 'fastapi-views[all]'

Quick start

from typing import ClassVar, Optional
from uuid import UUID

from fastapi import FastAPI
from pydantic import BaseModel

from fastapi_views import ViewRouter, configure_app
from fastapi_views.views.viewsets import AsyncAPIViewSet


class ItemSchema(BaseModel):
    id: UUID
    name: str
    price: int


class ItemViewSet(AsyncAPIViewSet):
    api_component_name = "Item"
    response_schema = ItemSchema

    # In-memory store — swap for a real repository in production
    items: ClassVar[dict[UUID, ItemSchema]] = {}

    async def list(self) -> list[ItemSchema]:
        return list(self.items.values())

    async def create(self, item: ItemSchema) -> ItemSchema:
        self.items[item.id] = item
        return item

    async def retrieve(self, id: UUID) -> Optional[ItemSchema]:
        return self.items.get(id)

    async def update(self, id: UUID, item: ItemSchema) -> ItemSchema:
        self.items[id] = item
        return item

    async def destroy(self, id: UUID) -> None:
        self.items.pop(id, None)


router = ViewRouter(prefix="/items")
router.register_view(ItemViewSet)

app = FastAPI(title="My API")
app.include_router(router)

configure_app(app)

This registers the following routes automatically:

Method Path Action Status code
GET /items list 200
POST /items create 201
GET /items/{id} retrieve 200
PUT /items/{id} update 200
DELETE /items/{id} destroy 204

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

fastapi_views-1.8.0.tar.gz (36.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

fastapi_views-1.8.0-py3-none-any.whl (52.7 kB view details)

Uploaded Python 3

File details

Details for the file fastapi_views-1.8.0.tar.gz.

File metadata

  • Download URL: fastapi_views-1.8.0.tar.gz
  • Upload date:
  • Size: 36.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.8.13

File hashes

Hashes for fastapi_views-1.8.0.tar.gz
Algorithm Hash digest
SHA256 eeac86750c13d6e48ed563c1432fda7c62c6600199b9174d005d58b10b5b83eb
MD5 57af3fc2c5369c65b2dd76ccb6ea2604
BLAKE2b-256 c5c3e9141adc67e77be972eb54b99e36065f79f5c3566a68b6c2b9409fd4f952

See more details on using hashes here.

File details

Details for the file fastapi_views-1.8.0-py3-none-any.whl.

File metadata

File hashes

Hashes for fastapi_views-1.8.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e96777b08ede00a01295aa5028598943a7b0b60944bd7b1bb6a22102ce727e67
MD5 c65caf0e4bb1160db0c4dbdd1927a20a
BLAKE2b-256 925f5d3d7b65ed10dd16aae5d83d38b70a65f13ad946023dac2a3f8c86af3eb7

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page