Home > Backend Development > Python Tutorial > Hello DEV Community! Introducing PydanticRPC: Build gRPC & Connect RPC Services Without Manually Writing Protobuf Files

Hello DEV Community! Introducing PydanticRPC: Build gRPC & Connect RPC Services Without Manually Writing Protobuf Files

Linda Hamilton
Release: 2025-01-30 10:11:08
Original
388 people have browsed it

Hello DEV Community! Introducing PydanticRPC: Build gRPC & Connect RPC Services Without Manually Writing Protobuf Files

This is my inaugural DEV post, introducing PydanticRPC, a Python library automating the creation of gRPC and Connect RPC services from Pydantic models. No more manual .proto file creation!

GitHub - PydanticRPC


Overview

Python REST APIs often leverage frameworks like FastAPI or Flask. However, for optimized data transfer or a schema-first approach, gRPC or Connect RPC are compelling alternatives. Traditional RPC workflows involve defining .proto files, code generation (using protoc or buf), and integration—a process often cumbersome and demanding.

PydanticRPC streamlines this. Define your RPC data structures with Pydantic models; PydanticRPC dynamically generates Protobuf definitions and launches the server.


What is PydanticRPC?

Key features:

  • Automated Protobuf Generation: Creates .proto files directly from your Python classes and Pydantic models.
  • Dynamic Code Generation: Uses grpcio-tools to generate server/client stubs and integrates your Python classes seamlessly.
  • Broad Support: Compatible with gRPC, gRPC-Web (via Sonora), Connect RPC (via Connecpy), and asynchronous (asyncio) operations, including server-streaming methods.

Essentially: "Define a Python class with Pydantic models, and instantly get an RPC service—no .proto files required!"


Installation

Install via PyPI:

pip install pydantic-rpc
Copy after login
Copy after login

Usage: Creating a gRPC Service

Use pydantic_rpc.Server to create a gRPC server.

Synchronous Example

# server.py
from pydantic_rpc import Server, Message

class HelloRequest(Message):
    name: str

class HelloReply(Message):
    message: str

class Greeter:
    def say_hello(self, request: HelloRequest) -> HelloReply:
        return HelloReply(message=f"Hello, {request.name}!")

if __name__ == "__main__":
    server = Server()
    server.run(Greeter())
Copy after login
Copy after login

Message aliases pydantic.BaseModel. Greeter exposes its methods. Server().run(Greeter()) generates the .proto file and starts a gRPC server (localhost:50051 by default).

Asynchronous Example

For async servers, use AsyncIOServer:

import asyncio
from pydantic_rpc import AsyncIOServer, Message

class HelloRequest(Message):
    name: str

class HelloReply(Message):
    message: str

class Greeter:
    async def say_hello(self, request: HelloRequest) -> HelloReply:
        return HelloReply(message=f"Hello, {request.name}!")

if __name__ == "__main__":
    server = AsyncIOServer()
    loop = asyncio.get_event_loop()
    loop.run_until_complete(server.run(Greeter()))
Copy after login

server.run(Greeter()) is a coroutine, run within your event loop.


Usage: Response Streaming

PydanticRPC supports server-streaming responses (currently async gRPC only). The example below uses pydantic_ai for Olympic trivia, showcasing both standard and streaming methods:

import asyncio
from typing import AsyncIterator

# ... (imports and class definitions as shown in the original) ...

if __name__ == "__main__":
    s = AsyncIOServer()
    loop = asyncio.get_event_loop()
    loop.run_until_complete(s.run(OlympicsAgent()))
Copy after login

ask is a unary RPC; ask_stream is server-streaming, yielding results incrementally. PydanticRPC generates a .proto file defining both, launching an async gRPC server.


Usage: Creating a Connect RPC Service

Integrate with Connecpy for Connect RPC in an ASGI app:

pip install pydantic-rpc
Copy after login
Copy after login

Pydantic handles validation. Integrate this app into your existing ASGI framework (FastAPI, Starlette).


Usage: Creating a gRPC-Web Service

Serve gRPC-Web in WSGI or ASGI applications:

# server.py
from pydantic_rpc import Server, Message

class HelloRequest(Message):
    name: str

class HelloReply(Message):
    message: str

class Greeter:
    def say_hello(self, request: HelloRequest) -> HelloReply:
        return HelloReply(message=f"Hello, {request.name}!")

if __name__ == "__main__":
    server = Server()
    server.run(Greeter())
Copy after login
Copy after login

Coexist gRPC-Web and REST endpoints.


Conclusion

PydanticRPC simplifies gRPC, gRPC-Web, and Connect RPC development from Pydantic models, including server-streaming. Explore the PydanticRPC GitHub repository for more details. Feedback welcome!

The above is the detailed content of Hello DEV Community! Introducing PydanticRPC: Build gRPC & Connect RPC Services Without Manually Writing Protobuf Files. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template