hawkapi-taskiq
TaskIQ integration for HawkAPI. Modern async-native task queue — a lighter, async-first alternative to Celery.
Install
pip install hawkapi-taskiq
pip install 'hawkapi-taskiq[redis]' # + taskiq-redis
pip install 'hawkapi-taskiq[nats]' # + taskiq-nats
pip install 'hawkapi-taskiq[cron]' # + croniter for schedule validation
Quickstart
from hawkapi import Depends, HawkAPI
from hawkapi_taskiq import TaskIQConfig, get_broker, init_taskiq, task
app = HawkAPI()
broker = init_taskiq(app, config=TaskIQConfig(broker_url="redis://localhost:6379/0"))
@task(broker, name="emails.send")
async def send_email(to: str, subject: str) -> None:
...
@app.post("/notify")
async def notify(email: str, b = Depends(get_broker)):
await send_email.kiq(email, "Hello")
return {"ok": True}
Broker selection
Choose by URL scheme — all others are rejected:
| URL | Broker |
|---|---|
memory:// |
InMemoryBroker (tests, single-process) |
redis://host:6379/0 |
ListQueueBroker (taskiq-redis) |
rediss://... |
same, with TLS |
nats://server:4222 |
NatsBroker (taskiq-nats) |
Any other scheme raises ValueError at create_broker() — this is a security feature, not a limitation. The allowlist prevents accidentally enabling brokers that use unsafe deserialization formats.
Scheduling
v0.1.0 ships a Scheduled value type with cron-syntax validation. Wire it to TaskIQ's native scheduler yourself — we deliberately avoid a "magic" registration helper that doesn't compose cleanly with the upstream TaskiqScheduler:
from hawkapi_taskiq import Scheduled
from taskiq import TaskiqScheduler
from taskiq.schedule_sources import LabelScheduleSource
@task(broker, name="myapp.cleanup")
async def cleanup() -> None:
...
# 1. Validate the schedule (cron syntax) up front.
schedule = Scheduled(cron="0 * * * *") # raises ValueError if malformed
# 2. Apply it as a label LabelScheduleSource reads.
cleanup.labels["schedule"] = [{"cron": schedule.cron, "args": [], "kwargs": {}}]
# 3. Run a scheduler process alongside the worker.
scheduler = TaskiqScheduler(broker=broker, sources=[LabelScheduleSource(broker)])
Scheduled(cron="...") validates via croniter (install with [cron] extra). Both cron and interval_seconds set are rejected (exactly one is required).
Health
from hawkapi_taskiq import check_broker
report = await check_broker(broker)
# HealthReport(broker_ok=True, broker_type="ListQueueBroker", error="")
Testing
from hawkapi_taskiq import in_memory_broker, task
async def test_my_task():
async with in_memory_broker() as broker:
@task(broker, name="t.work")
async def work(x: int) -> int:
return x * 2
await work.kiq(21)
# Execute pending tasks via TaskIQ's normal flow.
Security
- JSON-only serialization — TaskIQ defaults are fine; we explicitly reject any other serializer via
TaskIQConfig.serializerto prevent arbitrary-deserialization at consume time (CWE-502). - Broker URL scheme allowlist — only
memory://,redis://,rediss://,nats://. - Task name registry — duplicate
@task(name=...)raises at registration. TaskIQ silently overrides; we disallow. - Cron expression validation at registration time — malformed expressions fail fast.
Development
git clone https://github.com/Hawk-API/hawkapi-taskiq.git
cd hawkapi-taskiq
uv sync --extra dev
uv run pytest -q
uv run ruff check . && uv run ruff format --check .
uv run pyright src/
License
MIT.
Metadata
Release files for hawkapi-taskiq 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| hawkapi_taskiq-0.1.1.tar.gz | 72.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| hawkapi_taskiq-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 84.8 kB
Release files / hawkapi_taskiq-0.1.1.tar.gz
| Download URL | hawkapi_taskiq-0.1.1.tar.gz |
|---|---|
| Size | 72.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2c4c9874e075ee41966ee729301b7340dc0ddc6534520310370db59ae816b89f
|
|
BLAKE2b-256 checksum How to use checksums |
28ff20afd4532c2d2acc92b9c7a1c2c0f2169eb49dd6db839d62178e1f6bbfd8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 10, 2026.
Transparency logRelease files / hawkapi_taskiq-0.1.1-py3-none-any.whl
| Download URL | hawkapi_taskiq-0.1.1-py3-none-any.whl |
|---|---|
| Size | 11.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b1bcd9c0d474033cd065f51705540de70f2d63857faf8833bb2bf61d0a0b2ba7
|
|
BLAKE2b-256 checksum How to use checksums |
2be25858d9e9cb969a6744f1cb0e3211bf416af90bf08c7ee8bae893383f803d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 10, 2026.
Transparency log