FastAPI adapter for varco — routing, auth middleware, job running, typed HTTP client, and DI wiring
Project description
varco-fastapi
FastAPI integration and HTTP client utilities for varco.
Provides structured HTTP connection configuration, TLS trust-store management,
JWT authority, and HTTP middleware wiring on top of FastAPI and httpx.
Requires varco-core.
Install
pip install varco-fastapi
HTTP connection settings
HttpConnectionSettings is a structured config object that produces kwargs
for httpx.AsyncClient (or httpx.Client).
Unlike the Postgres/Redis/Kafka settings, there is no fixed env-var prefix.
A service typically calls many different external HTTP APIs — a hardcoded
HTTP_ prefix would only allow one of them to be configured from env vars at a
time. Instead, you supply a prefix when loading from env:
payment = HttpConnectionSettings.from_env(prefix="PAYMENT_API_")
notify = HttpConnectionSettings.from_env(prefix="NOTIF_API_")
Plain connection (no auth, no TLS)
import httpx
from varco_fastapi.connection import HttpConnectionSettings
# Direct construction — no env vars read
conn = HttpConnectionSettings(base_url="https://api.example.com/v1", timeout=10.0)
async with httpx.AsyncClient(**conn.to_httpx_kwargs()) as client:
response = await client.get("/users")
From environment variables (multi-client)
# Payment API
PAYMENT_API_BASE_URL=https://pay.example.com/v1
PAYMENT_API_TIMEOUT=5.0
# Notification API
NOTIF_API_BASE_URL=https://notify.example.com
NOTIF_API_TIMEOUT=10.0
payment = HttpConnectionSettings.from_env(prefix="PAYMENT_API_")
notify = HttpConnectionSettings.from_env(prefix="NOTIF_API_")
async with httpx.AsyncClient(**payment.to_httpx_kwargs()) as client:
await client.post("/charge", json={"amount": 9.99})
You can also configure via host and port instead of a full URL:
MY_SVC_HOST=api.example.com
MY_SVC_PORT=8080
# effective base_url → "http://api.example.com:8080"
With Basic authentication
from varco_core.connection import BasicAuthConfig
conn = HttpConnectionSettings(
base_url="https://api.example.com",
auth=BasicAuthConfig(username="svc-user", password="secret"),
)
# to_httpx_kwargs() includes auth=("svc-user", "secret") automatically
async with httpx.AsyncClient(**conn.to_httpx_kwargs()) as client:
response = await client.get("/protected")
From env:
MY_SVC_BASE_URL=https://api.example.com
MY_SVC_AUTH__TYPE=basic
MY_SVC_AUTH__USERNAME=svc-user
MY_SVC_AUTH__PASSWORD=secret
conn = HttpConnectionSettings.from_env(prefix="MY_SVC_")
With OAuth2 static bearer token
from varco_core.connection import OAuth2Config
conn = HttpConnectionSettings(
base_url="https://api.example.com",
auth=OAuth2Config(token="eyJhbGciOiJSUzI1NiJ9..."),
)
# OAuth2 is NOT injected into kwargs automatically — httpx has no built-in
# OAuth2 flow. Add the Authorization header via a middleware or event hook:
async with httpx.AsyncClient(**conn.to_httpx_kwargs()) as client:
response = await client.get(
"/protected",
headers={"Authorization": f"Bearer {conn.auth.token}"},
)
Note: For OAuth2 client-credentials flows (token refresh), use an
httpxevent hook or middleware —HttpConnectionSettingsis a pure config object and does not manage token lifecycle.
With TLS / SSL (custom CA)
from varco_core.connection import SSLConfig
from pathlib import Path
ssl = SSLConfig(ca_cert=Path("/etc/ssl/api-ca.pem"), verify=True)
conn = HttpConnectionSettings.with_ssl(
ssl,
base_url="https://secure-api.example.com",
)
# to_httpx_kwargs()["verify"] → ssl.SSLContext built from the CA cert
async with httpx.AsyncClient(**conn.to_httpx_kwargs()) as client:
response = await client.get("/data")
From env:
MY_SVC_BASE_URL=https://secure-api.example.com
MY_SVC_SSL__CA_CERT=/etc/ssl/api-ca.pem
MY_SVC_SSL__VERIFY=true
conn = HttpConnectionSettings.from_env(prefix="MY_SVC_")
Disable TLS verification (dev / testing only)
ssl = SSLConfig(verify=False, check_hostname=False)
conn = HttpConnectionSettings.with_ssl(ssl, base_url="https://localhost:8443")
# to_httpx_kwargs()["verify"] → False
With mTLS (client certificates)
ssl = SSLConfig(
ca_cert=Path("/etc/ssl/ca.pem"),
client_cert=Path("/etc/ssl/client.crt"),
client_key=Path("/etc/ssl/client.key"),
)
conn = HttpConnectionSettings.with_ssl(ssl, base_url="https://mtls-api.example.com")
async with httpx.AsyncClient(**conn.to_httpx_kwargs()) as client:
response = await client.get("/secure")
Bridge to TrustStore (legacy ClientProfile)
trust_store = conn.to_trust_store() # None when ssl is not set
# use with ClientProfile.production(trust_store=trust_store)
Connection settings reference
All field names below assume a prefix of MY_SVC_ — replace it with your own.
| Env var | Default | Description |
|---|---|---|
{PREFIX}HOST |
localhost |
API hostname (used when BASE_URL is empty) |
{PREFIX}PORT |
443 |
API port (used when BASE_URL is empty) |
{PREFIX}BASE_URL |
(empty) | Full base URL — overrides host/port when set |
{PREFIX}TIMEOUT |
30.0 |
Default request timeout in seconds |
{PREFIX}SSL__CA_CERT |
— | Path to CA certificate |
{PREFIX}SSL__CLIENT_CERT |
— | Path to client certificate (mTLS) |
{PREFIX}SSL__CLIENT_KEY |
— | Path to client private key (mTLS) |
{PREFIX}SSL__VERIFY |
true |
TLS peer verification (false = skip) |
{PREFIX}AUTH__TYPE |
— | basic or oauth2 |
{PREFIX}AUTH__USERNAME |
— | Basic auth username |
{PREFIX}AUTH__PASSWORD |
— | Basic auth password |
{PREFIX}AUTH__TOKEN |
— | OAuth2 static bearer token |
Related packages
| Package | Description |
|---|---|
varco-core |
Domain model, service layer, JWT authority — required dependency |
varco-sa |
SQLAlchemy async backend |
varco-kafka |
Kafka event bus backend |
varco-redis |
Redis event bus + cache backend |
Links
- Repository: https://github.com/edoardoscarpaci/varco
- Issue tracker: https://github.com/edoardoscarpaci/varco/issues
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file varco_fastapi-1.0.6.tar.gz.
File metadata
- Download URL: varco_fastapi-1.0.6.tar.gz
- Upload date:
- Size: 182.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.12 {"installer":{"name":"uv","version":"0.10.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
00062f37dd93d9ae33e861cea6bb26f903f289967fbf730db743505e0cd35a93
|
|
| MD5 |
7681339a634b2325029ffabeb4b0868e
|
|
| BLAKE2b-256 |
72afff7f251219af7c95875d5e708a2b873aa528f9913c630c57f14aad17f101
|
File details
Details for the file varco_fastapi-1.0.6-py3-none-any.whl.
File metadata
- Download URL: varco_fastapi-1.0.6-py3-none-any.whl
- Upload date:
- Size: 174.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.12 {"installer":{"name":"uv","version":"0.10.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f0eb10451888a0567f0756ff8496ba84f5b39c0211a8d136d488120febe4f46d
|
|
| MD5 |
d15e7fe9d0e2a4e61bb21d72c05f2029
|
|
| BLAKE2b-256 |
89fe769584d63756dffc61582e5ebf7dbd54f8410c0f6ba406428f4b2729a2b7
|