gRPC with autogen by Pydantic models
Project description
Pydantic & gRPC
py-grpcio is a microframework and high-level wrapper of grpcio to simplify work with the original library using abstractions, useful python objects and pydantic models.
Examples of use are given below and also duplicated in the example directory.
Install latest
pip install py-grpcio
Example
Models
Pydantic models that describe messages for client-server interaction.
from uuid import UUID, uuid4
from datetime import datetime
from pydantic import Field
from py_grpcio import Message
from example.server.service.enums import Names
class PingRequest(Message):
id: UUID = Field(default_factory=uuid4)
class PingResponse(Message):
id: UUID
timestamp: datetime = Field(default_factory=datetime.now)
class ComplexModel(Message):
name: Names
class ComplexRequest(Message):
id: UUID
model: ComplexModel
class ComplexResponse(Message):
id: UUID
model: ComplexModel
Server
Basic implementation of gRPC services on the server side.
You need to describe the service abstractly and duplicate this service on the client side.
from abc import abstractmethod
from py_grpcio import BaseService
from example.server.service.models import PingRequest, PingResponse, ComplexRequest, ComplexResponse
class BaseExampleService(BaseService):
@abstractmethod
async def ping(self: 'BaseExampleService', request: PingRequest) -> PingResponse:
...
@abstractmethod
async def complex(self: 'BaseExampleService', request: ComplexRequest) -> ComplexResponse:
...
Full implementation of the gRPC service with methods.
from example.server.service.base import BaseExampleService
from example.server.service.models import PingRequest, PingResponse, ComplexRequest, ComplexResponse
class ExampleService(BaseExampleService):
async def ping(self: 'ExampleService', request: PingRequest) -> PingResponse:
return PingResponse(id=request.id)
async def complex(self: 'BaseExampleService', request: ComplexRequest) -> ComplexResponse:
return ComplexResponse(**request.model_dump())
Run the ExampleService on Server.
from py_grpcio import BaseServer
from example.server.service import ExampleService
if __name__ == '__main__':
server: BaseServer = BaseServer()
server.add_service(service=ExampleService)
server.run()
Note that on the client side, this class must be named the same as it is named in the full server-side implementation.
That is, if on the server we call the base class as BaseExampleService
and the class with the implementation of
methods as ExampleService
, then on the client side the abstract service should be called ExampleService
.
Client
from abc import abstractmethod
from py_grpcio import BaseService
from example.server.service.models import PingRequest, PingResponse, ComplexRequest, ComplexResponse
class ExampleService(BaseService):
@abstractmethod
async def ping(self: 'ExampleService', request: PingRequest) -> PingResponse:
...
@abstractmethod
async def complex(self: 'ExampleService', request: ComplexRequest) -> ComplexResponse:
...
Calling the ExampleService endpoints by Client.
from uuid import uuid4
from asyncio import run
from loguru import logger
from example.client.services.example import (
ExampleService, PingRequest, PingResponse, ComplexModel, ComplexRequest, ComplexResponse, Names
)
service: ExampleService = ExampleService(host='127.0.0.1')
async def main() -> None:
response: PingResponse = await service.ping(request=PingRequest())
logger.info(f'ping response: {response}')
response: ComplexResponse = await service.complex(
request=ComplexRequest(id=uuid4(), model=ComplexModel(name=Names.NAME_1))
)
logger.info(f'complex response: {response}')
if __name__ == '__main__':
run(main())
Notes
-
You can use the library on the client side even if the server is implemented differently by simply describing it as an abstract service
-
The client can also be implemented using other libraries, the server that uses
py-grpcio
will still be able to accept such requests
Project details
Release history Release notifications | RSS feed
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
File details
Details for the file py_grpcio-1.6.0.tar.gz
.
File metadata
- Download URL: py_grpcio-1.6.0.tar.gz
- Upload date:
- Size: 12.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.0 CPython/3.9.19
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | a20105cc80a6a50d5d053763b6c3d22dcb9a921d70e90a64996e1e030f26e595 |
|
MD5 | 25efbf6f62c33d6e12130067677faf08 |
|
BLAKE2b-256 | 2217e26aef175b2d13961bff19382db48198521eb1ee22eecc4484fbbc013c2d |
File details
Details for the file py_grpcio-1.6.0-py3-none-any.whl
.
File metadata
- Download URL: py_grpcio-1.6.0-py3-none-any.whl
- Upload date:
- Size: 16.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.0 CPython/3.9.19
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 55712b191b8f73a083dc3a4b54f00dc0778e0b897e2b9320113b72addabf1268 |
|
MD5 | 987aa4480fa42bbfedecbfa77f725674 |
|
BLAKE2b-256 | df50b9335b6f5059411e9e65b68836dbeb5ec3845391d0ff42e3da23de6e6db3 |