| title | Python |
|---|---|
| description | Connect one Python backend service to another with Graftcode - no REST clients, no DTOs, no handwritten integration code. Install a strongly-typed Graft and call remote methods directly from your service logic. |
Connect a Python backend service to another remote service using Graftcode - so the remote integration stays strongly typed and reads like a normal method call.
- Install a remote service as a strongly-typed Graft via
pip. - Configure the generated client to point at the remote host.
- Call a remote method from your own service logic as if it were a local class.
- Use IDE autocompletion on the remote service's methods and classes.
- Python installed locally
Create a new project folder for your backend service:
mkdir py-energy-consumer
cd py-energy-consumerWe're hosting this sample service for you so you can see exactly what connecting to another team's service looks like in practice - open it in Graftcode Vision to explore.
Graftcode Vision shows all public classes and methods exposed by the remote service - their names, parameter types, and return types. It also gives you the exact package manager command needed to install that service as a Graft.
Open Graftcode Vision, pick PyPI, and copy the generated install command.
python -m pip install --extra-index-url https://grft.dev/simple/4b4e411f-60a0-4868-b8a6-46f5dee07448__free graft-nuget-energypriceservice==1.2.0This adds the generated strongly-typed client for the remote service to your project.
The exact configuration snippet for your language is available in Graftcode Vision under the Configuration installation tab. Create main.py:
The generated PyPI Graft uses a flat package layout (graft_config.py, meter_logic.py). Import those modules directly:
import os
from graft_nuget_energypriceservice.graft_config import GraftConfig
from graft_nuget_energypriceservice.meter_logic import MeterLogic
GraftConfig.host = "wss://g-d-ca-polc-demo-ecbe-01.nicedesert-fa74799d.polandcentral.azurecontainerapps.io/ws"
consumption = MeterLogic.net_consumption_k_wh(1000, 1150)
print(f"Net consumption: {consumption}", flush=True)
os._exit(0)Run it:
python main.pyThe Python Graft exposes net_consumption_k_wh (snake_case; the generator also splits KWh as k_wh). Use flush=True before os._exit(0) so the printed result is not lost when the process exits immediately.
You should see the net consumption value printed in your terminal. MeterLogic.net_consumption_k_wh(...) is a remote call, but your code reads like a normal method invocation - no HTTP request, no response parsing, no serialization.
Your IDE can autocomplete available methods on MeterLogic, BillingLogic, and any other class from that service because the Graft is a real installed package.
Everything above works without any account - perfect for learning and local development. When you're ready for real-world usage, create a free account at portal.graftcode.com, set up a project, and copy its Project Key.
With a Project Key, point GraftConfig.host at your project's stable registry URL instead of a raw WebSocket address. A Project Key gives you:
- Stable registry URL - the address for your Grafts stays permanent, so install commands don't change when you redeploy.
- Portal visibility - see all your gateways and services in one place at gateways.graftcode.com.
- Access control - decide who can download your Grafts using package manager authentication and permissions.
Connecting one backend service to another typically requires:
- Designing and implementing REST or gRPC endpoints in the remote service
- Defining request/response DTOs for every operation
- Writing or generating an OpenAPI or Protobuf spec
- Building or generating a client SDK in the consuming service's language
- Manually keeping both sides in sync when signatures change
- Adding error handling, retry logic, and serialization code
- Install the remote service as a strongly-typed Graft via
pip install - Import its classes and call methods directly - no REST client code
- When the remote service changes, update with one command - like any other package
Connecting two backend services with Graftcode is as simple as installing a pip package. No REST routes, no DTOs, no client generation - just import and call.
