Python implementation of Twirp RPC framework (supports Twirp Wire Protocol v7).
This repo contains a protoc plugin that generates sever and client code and a pypi package with common implementation details.
For details about the twirp project, check https://github.com/twitchtv/twirp
Grab the protoc plugin to generate files with
go get -u github.com/verloop/twirpy/protoc-gen-twirpy
Add the twirp package to your project
pip install twirp
You'll also need uvicorn to run the server.
Use the protoc plugin to generate twirp server and client code.
We'll assume familiarity with the example from the docs. https://twitchtv.github.io/twirp/docs/example.html
protoc --python_out=./ --twirpy_out=./ ./haberdasher.proto
# server.pyimportrandomfromtwirp.asgiimportTwirpASGIAppfromtwirp.exceptionsimportInvalidArgumentfrom . importhaberdasher_twirp, haberdasher_pb2classHaberdasherService(object):
defMakeHat(self, context, size):
ifsize.inches<=0:
raiseInvalidArgument(argument="inches", error="I can't make a hat that small!")
returnhaberdasher_pb2.Hat(
size=size.inches,
color=random.choice(["white", "black", "brown", "red", "blue"]),
name=random.choice(["bowler", "baseball cap", "top hat", "derby"])
)
# if you are using a custom prefix, then pass it as `server_path_prefix`# param to `HaberdasherServer` class.service=haberdasher_twirp.HaberdasherServer(service=HaberdasherService())
app=TwirpASGIApp()
app.add_service(service)Run the server with
uvicorn twirp_server:app --port=3000
# client.pyfromtwirp.contextimportContextfromtwirp.exceptionsimportTwirpServerExceptionfrom . importhaberdasher_twirp, haberdasher_pb2client=haberdasher_twirp.HaberdasherClient("http://localhost:3000")
# if you are using a custom prefix, then pass it as `server_path_prefix`# param to `MakeHat` class.try:
response=client.MakeHat(ctx=Context(), request=haberdasher_pb2.Size(inches=12))
print(response)
exceptTwirpServerExceptionase:
print(e.code, e.message, e.meta, e.to_dict())Twirpy generates the code based on the protocol v7. This is a breaking change from the previous v5 and you can see the changes here.
This new version comes with flexibility to use any prefix for the server URLs and defaults to /twirp. To use an empty prefix or any custom prefix like /my/custom/prefix, pass it as a server_path_prefix param to server and clients. Check the example directory, which uses /twirpy as a custom prefix.
If you want to use the server and clients of v5, then use the 0.0.1 release.
Currently, message body length limit is set to 100kb, you can override this by passing max_receive_message_length to TwirpASGIApp constructor.
# this sets max message length to be 10 bytesapp=TwirpASGIApp(max_receive_message_length=10)Python: #twirp. Join PySlackers here
Go: #twirp. Join Gophers community slack here
- The initial version of twirpy was made from an internal copy of https://github.com/daroot/protoc-gen-twirp_python_srv
- The
run_in_threadpoolmethod comes from https://github.com/encode/starlette