Skip to main content

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

  1. Define cron jobs and tasks with @pb.cron() and @pb.task() decorators
  2. Mount the handler using your framework's routing
  3. On the first request, the SDK registers your functions with the Pingback platform
  4. The platform sends signed HTTP requests to your handler when jobs are due
  5. The handler verifies the HMAC signature, executes the function, and returns results
  6. 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

pingback_py-0.1.0.tar.gz (8.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pingback_py-0.1.0-py3-none-any.whl (8.1 kB view details)

Uploaded Python 3

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

Hashes for pingback_py-0.1.0.tar.gz
Algorithm Hash digest
SHA256 4606b15728eb4d7950af08a13a40c2c3232124a691d02f113599f395016ee6d8
MD5 512a0451511e271e435da675d7078d4e
BLAKE2b-256 2244da15d71278d311da1c45dffc40e8de08733b35cbddcf976a7bc3240806d1

See more details on using hashes here.

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

Hashes for pingback_py-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c9bb3758734c24a4c123374e63045789a9036aacc1853591400a1abfaa899578
MD5 51e7499b58155f771e99a609040366fe
BLAKE2b-256 0a92484385deb4b086b6d92bd8a5b981e130bdd999d5665f0832f3360463c9c9

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page