Skip to main content

FastAPI-like developer experience for gRPC: pydantic-first, async, built on grpc.aio

Project description

fastgrpc2

FastAPI-подобная эргономика для gRPC. Pydantic на входе и выходе, вся механика grpc.aio — внутри. Сестра fastkafka2: тот же стиль App / группа / декораторы / lifespan, но для gRPC.

Стек — чистый Python на grpc.aio (C-ядро gRPC + upb + pydantic-core). Это тонкий эргономичный слой, не новый транспорт: потолок = grpc.aio, цена — FastAPI-стиль, а не скорость компилируемых языков.

Пример

Сервер:

from pydantic import BaseModel
from fastgrpc2 import GrpcApp, GrpcService, Context, Depends, GrpcError, StatusCode

class GetOrderRequest(BaseModel):
    order_number: str

class OrderReply(BaseModel):
    order_number: str
    status: str

service = GrpcService("Orders")

@service.unary("GetOrder")
async def get_order(request: GetOrderRequest, ctx: Context) -> OrderReply:
    if not request.order_number:
        raise GrpcError(StatusCode.INVALID_ARGUMENT, "order_number required")
    return OrderReply(order_number=request.order_number, status="paid")

app = GrpcApp("orders", address="0.0.0.0:50051")
app.add_service(service)
# await app.run()

Клиент:

from fastgrpc2 import GrpcClient, Channel

class OrderClient(GrpcClient):
    service = "Orders"
    get_order = GrpcClient.unary("GetOrder", GetOrderRequest, OrderReply)

async with Channel("127.0.0.1:50051", default_timeout=5.0) as ch:
    client = OrderClient(ch)
    reply = await client.get_order(GetOrderRequest(order_number="A-100"))
    print(reply.status)  # -> "paid"

Статус (v0.2) — v1-скоуп закрыт, всё проверено прогоном

  • 4 типа вызовов: @service.unary / unary_stream / stream_unary / stream_stream.
  • codec pydantic↔protobuf: динамические дескрипторы; bool/int/float/str/bytes, вложенные BaseModel, list[...], Optional[...] (с proto3-presence). Не поддержанное (enum/dict/datetime/Union) — явный TypeError, не заглушка.
  • export_proto() — .proto-контракт из моделей.
  • Context: metadata, deadline (time_remaining), trailing-metadata, peer.
  • Metadata multimap; GrpcError + StatusCode + rich-детали (BadRequest/ ErrorInfo, через grpc-status-details-bin).
  • Клиент: Channel (переиспользуемый) + типизированный GrpcClient, per-call timeout/metadata.
  • Безопасность: TLS / MTLS / Insecure / BearerToken.
  • Интерсепторы (pre-hook auth/логирование), Depends + dependency_overrides.
  • Lifespan, graceful stop(grace), run().
  • enable_health() (grpc.health.v1), TestClient (in-process).
  • Ручки: Compression, max_send_bytes/max_recv_bytes, RetryPolicy, Keepalive; deadline-propagation по цепочке.

Проверочные прогоны (из корня пакета): smoke_test.py (вызовы/presence/rich-errors), features_test.py (TestClient/health/bearer/overrides), tls_test.py (mTLS), config_test.py (compression/size/interceptor/deadline), bench.py (клей-налог над голым grpc.aio — единицы %).

Later (не v1): write()/done_writing() для bidi-клиента, server reflection, OTel, Connect/gRPC-Web, отмена-propagation, полный набор 10 google.rpc деталей с google-namespace type_url.

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

fastgrpc2-0.3.0.tar.gz (28.5 kB view details)

Uploaded Source

Built Distribution

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

fastgrpc2-0.3.0-py3-none-any.whl (28.6 kB view details)

Uploaded Python 3

File details

Details for the file fastgrpc2-0.3.0.tar.gz.

File metadata

  • Download URL: fastgrpc2-0.3.0.tar.gz
  • Upload date:
  • Size: 28.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.0

File hashes

Hashes for fastgrpc2-0.3.0.tar.gz
Algorithm Hash digest
SHA256 d182581fc4ce259a92f15ec13cdb8c40f3efece6a60443043ede4a63debfd1ee
MD5 e60422abadbca27d5cdd81404d1784f4
BLAKE2b-256 ef5e322dbd5e438d8620d9bd38e2b1d9eccea859debd3f0029717f3a2a3b50c8

See more details on using hashes here.

File details

Details for the file fastgrpc2-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: fastgrpc2-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 28.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.0

File hashes

Hashes for fastgrpc2-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 82d1a35e4bb59281f6d1b4eef5d5f1e2d97c1d92ba7a13f422e59654c007b63a
MD5 3526952f87c9ab6b759c1822e6f401b7
BLAKE2b-256 7c500813349d7af2f8a8ee286295588230d9f73a6460fe4027af2647dce70b6f

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