Skip to main content

grpc for Humans. grpc reflection support client

Project description

grpc requests

PyPI - Python Version PyPI PyPI download month codecov Views

GRPC for Humans

from grpc_requests import Client

client = Client.get_by_endpoint("localhost:50051")
assert client.service_names == ["helloworld.Greeter"]

request_data = {"name": 'sinsky'} 
result = client.request("helloworld.Greeter", "SayHello", request_data)
print(result) # {"message":"Hello sinsky"}

Features

  • supports creating clients easily when connecting to servers implementing grpc reflection
  • supports implementing stub clients for connecting to servers that do not implement reflection
  • support all unary and stream methods
  • supports both TLS and compression connections
  • supports AsyncIO API

Install

pip install grpc_requests

Use it like RPC

If your server supports reflection, use the Client class:

from grpc_requests import Client

client = Client.get_by_endpoint("localhost:50051")
# if you want a TLS connection
# client = Client.get_by_endpoint("localhost:443",ssl=True)
# or if you want a compression enabled connection
# client = Client.get_by_endpoint("localhost:443",compression=grpc.Compression.Gzip)
assert client.service_names == ["helloworld.Greeter",'grpc.health.v1.Health']

health = client.service('grpc.health.v1.Health')
assert health.method_names == ('Check', 'Watch')

result = health.Check()
assert result == {'status': 'SERVING'}

If not, use the StubClient class:

from grpc_requests import StubClient
from .helloworld_pb2 import Descriptor

service_descriptor = DESCRIPTOR.services_by_name['Greeter'] # or you can just use _GREETER


client = StubClient.get_by_endpoint("localhost:50051",service_descriptors=[service_descriptor,])
assert client.service_names == ["helloworld.Greeter"]

In both cases, the same methods are used to interact with the server.

greeter = client.service("helloworld.Greeter")

request_data = {"name": 'sinsky'}
result = greeter.SayHello(request_data)
results = greeter.SayHelloGroup(request_data)

requests_data = [{"name": 'sinsky'}]
result = greeter.HelloEveryone(requests_data)
results = greeter.SayHelloOneByOne(requests_data)

Examples

Reflection Client but you can send message by stub

from grpc_requests import Client
from helloworld_pb2 import HelloRequest

port = '50051'
host = "localhost"
endpoint = f"{host}:{port}"

client = Client.get_by_endpoint(endpoint)
print(client.service_names) # ["helloworld.Greeter"]

service = "helloworld.Greeter"
method = 'SayHello'

result = client.unary_unary(service, method, HelloRequest(name='sinsky'))
print(type(result)) # result is dict Type!!! not Stub Object!
print(result) # {"message":"Hellow sinsky"}

# or get raw response data
result = client.unary_unary(service, method, HelloRequest(name='sinsky'),raw_output=True)
print(type(result)) # HelloReply stub class

AsyncIO API

from grpc_requests.aio import AsyncClient

client = AsyncClient("localhost:50051")

health = await client.service('grpc.health.v1.Health')
assert health.method_names == ('Check', 'Watch')

result = await health.Check()
assert result == {'status': 'SERVING'}

greeter = await client.service("helloworld.Greeter")

request_data = {"name": 'sinsky'}
result = await greeter.SayHello(request_data)

results =[x async for x in await greeter.SayHelloGroup(request_data)] 

requests_data = [{"name": 'sinsky'}]
result = await greeter.HelloEveryone(requests_data)
results = [x async for x in await greeter.SayHelloOneByOne(requests_data)]  

Road map

  • support no reflection server(Stub Client)
  • support async API!
  • Document!
  • pluggable interceptor

Maintainers

ChangeLog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

0.1.10 - 2023-03-07

Fixed

  • Corrected pin of protobuf version in requirements.txt

0.1.9 - 2023-02-14

Changes

  • Reimplementation of test case framework
  • Restoration of reflection client test cases
  • Updates to continuous integration pipeline

0.1.8 - 2023-01-24

Changes

  • Update project and dev dependencies to versions that require Python >= 3.7
  • Update project documentation and examples

0.1.7 - 2022-12-16

Deprecated

  • homi dependency, as the project has been archived
  • homi dependent test code

0.1.6 - 2022-11-10

Fixed

  • Ignore repeat imports of protobufs and reflecting against a server

0.1.3 - 2022-7-14

Fixed

  • remove click

Issues

  • ignore test before deploy

0.1.2 - 2022-7-7

0.1.1 - 2022-6-13

Changes

  • remove unused package : click #35

0.1.0 - 2021-8-21

Added

  • Full TLS connection support

Fixed

  • Ignore reflection if service already registered

Changed

  • Update grpcio version

0.0.10 - 2021-2-27

Fixed

  • Fix 3.6 compatibility issue : await is in f-string

0.0.9 - 2020-12-25

Added

  • Support AsyncIO API

0.0.8 - 2020-11-24

Added

  • Add StubClient

Fixed

  • Bypasss kwargs to base client

0.0.7 - 2020-10-4

Added

  • Support Compression

0.0.6 - 2020-10-3

Added

  • Support TLS connections

0.0.5 - 2020-9-9

Changed

  • Response filled gets original proto field name rather than(before returned lowerCamelCase)

0.0.4 - 2020-7-21

0.0.3 - 2020-7-21

Added

  • Dynamic request method
  • Service client

0.0.2 - 2020-7-20

Added

  • Support all method types
  • Add request test case

0.0.1 - 2020-7-20

Added

  • Sync proto using reflection
  • Auto convert request(response) from(to) dict
  • Support unary-unary

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

grpc_requests-0.1.11.tar.gz (19.9 kB view hashes)

Uploaded Source

Built Distribution

grpc_requests-0.1.11-py3-none-any.whl (28.2 kB view hashes)

Uploaded Python 3

Supported by

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