Getting started with the Dapr Python gRPC service extension

How to get up and running with the Dapr Python gRPC extension package

The Dapr Python SDK provides a built in gRPC server extension module, dapr.ext.grpc, for creating Dapr services.

Installation

You can download and install the Dapr gRPC server extension module with:

  1. pip install dapr-ext-grpc

Note

  1. The development package will contain features and behavior that will be compatible with the pre-release version of the Dapr runtime. Make sure to uninstall any stable versions of the Python SDK extension before installing the dapr-dev package.
  1. pip3 install dapr-ext-grpc-dev

Examples

The App object can be used to create a server.

Listen for service invocation requests

The InvokeMethodReqest and InvokeMethodResponse objects can be used to handle incoming requests.

A simple service that will listen and respond to requests will look like:

  1. from dapr.ext.grpc import App, InvokeMethodRequest, InvokeMethodResponse
  2. app = App()
  3. @app.method(name='my-method')
  4. def mymethod(request: InvokeMethodRequest) -> InvokeMethodResponse:
  5. print(request.metadata, flush=True)
  6. print(request.text(), flush=True)
  7. return InvokeMethodResponse(b'INVOKE_RECEIVED', "text/plain; charset=UTF-8")
  8. app.run(50051)

A full sample can be found here.

Subscribe to a topic

  1. from cloudevents.sdk.event import v1
  2. from dapr.ext.grpc import App
  3. app = App()
  4. # Default subscription for a topic
  5. @app.subscribe(pubsub_name='pubsub', topic='TOPIC_A')
  6. def mytopic(event: v1.Event) -> None:
  7. print(event.Data(),flush=True)
  8. # Specific handler using Pub/Sub routing
  9. @app.subscribe(pubsub_name='pubsub', topic='TOPIC_A',
  10. rule=Rule("event.type == \"important\"", 1))
  11. def mytopic_important(event: v1.Event) -> None:
  12. print(event.Data(),flush=True)
  13. app.run(50051)

A full sample can be found here.

Setup input binding trigger

  1. from dapr.ext.grpc import App, BindingRequest
  2. app = App()
  3. @app.binding('kafkaBinding')
  4. def binding(request: BindingRequest):
  5. print(request.text(), flush=True)
  6. app.run(50051)

A full sample can be found here.