grpc for Humans. grpc reflection support client
Project description
grpc requests
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":"Hellow 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
- sinsky - wesky93
- Wayne Manselle - ViridianForge
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.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
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
grpc_requests-0.1.8.tar.gz
(19.1 kB
view hashes)
Built Distribution
Close
Hashes for grpc_requests-0.1.8-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f9a80dd21e05b81f2db4176b71e45a1362d1336052788bc338ecacdbc041c074 |
|
MD5 | 60c8d1554816d43f72504956ea265c74 |
|
BLAKE2b-256 | ceaff715e0e9660fa8ae8fbedc03b52c95aeda557914148b9e598c3c9732e734 |