Python SDK for Pingback — reliable cron jobs and background tasks
Project description
pingback-py
Python SDK for Pingback — reliable cron jobs and background tasks.
Installation
pip install pingback-py
Quick Start
import os
from pingback import Pingback
pb = Pingback(
api_key=os.environ["PINGBACK_API_KEY"],
cron_secret=os.environ["PINGBACK_CRON_SECRET"],
)
@pb.cron("cleanup", "0 3 * * *", retries=2, timeout="60s")
def cleanup(ctx):
removed = remove_expired_sessions()
ctx.log("Removed sessions", count=removed)
return {"removed": removed}
@pb.task("send-email", retries=3, timeout="15s")
def send_email(ctx):
to = ctx.payload["to"]
deliver_email(to)
ctx.log("Sent email", to=to)
return {"sent": to}
Framework Integration
Flask
from flask import Flask
app = Flask(__name__)
app.route("/api/pingback", methods=["POST"])(pb.flask_handler())
FastAPI
from fastapi import FastAPI
app = FastAPI()
app.post("/api/pingback")(pb.fastapi_handler())
Django
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def pingback_handler(request):
result = pb.handle(request.body, dict(request.headers))
status = result.pop("_status", 200)
return JsonResponse(result, status=status)
Any Framework
result = pb.handle(body=request_body_bytes, headers=request_headers_dict)
Defining Functions
Cron Jobs
@pb.cron("daily-report", "0 9 * * *", retries=3, timeout="60s")
def daily_report(ctx):
report = generate_report()
ctx.log("Report generated", rows=report.row_count)
return report
Background Tasks
@pb.task("process-upload", retries=2, timeout="5m")
def process_upload(ctx):
file_id = ctx.payload["file_id"]
result = process_file(file_id)
ctx.log("Processed file", file_id=file_id)
return result
Fan-Out
@pb.cron("send-emails", "*/15 * * * *")
def send_emails(ctx):
pending = get_pending_emails()
for email in pending:
ctx.task("send-email", {"id": email.id})
ctx.log("Dispatched emails", count=len(pending))
return {"dispatched": len(pending)}
Workflows (Task Chaining)
Tasks can call ctx.task() to chain into multi-step workflows with branching:
@pb.task("validate-order", retries=2)
def validate_order(ctx):
order = ctx.payload
ctx.log("Validating", order_id=order["order_id"])
if order["amount"] <= 0:
ctx.task("notify-failure", {"order_id": order["order_id"], "reason": "Invalid amount"})
return {"valid": False}
ctx.task("charge-payment", order)
return {"valid": True}
@pb.task("charge-payment", retries=3)
def charge_payment(ctx):
charge = stripe.Charge.create(amount=ctx.payload["amount"] * 100)
ctx.log("Charged", charge_id=charge.id)
ctx.task("send-confirmation", ctx.payload)
@pb.task("send-confirmation", retries=2)
def send_confirmation(ctx):
send_email(ctx.payload["email"], "Order confirmed")
ctx.log("Confirmation sent")
Each step runs as its own execution with independent retries and logging. The workflow graph in your dashboard visualizes the full chain.
Programmatic Triggering
exec_id = pb.trigger("send-email", {"to": "user@example.com"})
Structured Logging
ctx.log("message") # info
ctx.log("message", key="value") # info with metadata
ctx.warn("slow query", ms=2500) # warning
ctx.error("failed", code="E001") # error
ctx.debug("cache stats", hits=847) # debug
Configuration
pb = Pingback(
api_key="pb_live_...",
cron_secret="...",
platform_url="https://api.pingback.lol", # default
base_url="https://myapp.com", # your app's public URL
)
Function Options
@pb.cron("job", "* * * * *", retries=3, timeout="30s", concurrency=5)
@pb.task("job", retries=3, timeout="30s", concurrency=5)
Environment Variables
PINGBACK_API_KEY=pb_live_... # From your Pingback project settings
PINGBACK_CRON_SECRET=... # From your Pingback project settings
How It Works
- Define cron jobs and tasks with
@pb.cron()and@pb.task()decorators - Mount the handler using your framework's routing
- On the first request, the SDK registers your functions with the Pingback platform
- The platform sends signed HTTP requests to your handler when jobs are due
- The handler verifies the HMAC signature, executes the function, and returns results
- Fan-out tasks are dispatched independently by the platform
Project details
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 pingback_py-0.1.0.tar.gz.
File metadata
- Download URL: pingback_py-0.1.0.tar.gz
- Upload date:
- Size: 8.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4606b15728eb4d7950af08a13a40c2c3232124a691d02f113599f395016ee6d8
|
|
| MD5 |
512a0451511e271e435da675d7078d4e
|
|
| BLAKE2b-256 |
2244da15d71278d311da1c45dffc40e8de08733b35cbddcf976a7bc3240806d1
|
File details
Details for the file pingback_py-0.1.0-py3-none-any.whl.
File metadata
- Download URL: pingback_py-0.1.0-py3-none-any.whl
- Upload date:
- Size: 8.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c9bb3758734c24a4c123374e63045789a9036aacc1853591400a1abfaa899578
|
|
| MD5 |
51e7499b58155f771e99a609040366fe
|
|
| BLAKE2b-256 |
0a92484385deb4b086b6d92bd8a5b981e130bdd999d5665f0832f3360463c9c9
|