Django Integration
Generate PDF documents from Django applications using the Document Stack Python SDK.
Installation
Bash
pip install document-stackAdd your API key to your Django settings or .env:
settings.py
DS_API_KEY = os.environ.get("DS_API_KEY")Client Setup
Create a shared client instance to reuse across views:
documents/client.py
from django.conf import settings
from document_stack import DocumentStack
ds_client = DocumentStack(api_key=settings.DS_API_KEY)Generate View
documents/views.py
from django.http import JsonResponse
from django.views.decorators.http import require_POST
from django.contrib.auth.decorators import login_required
import json
from .client import ds_client
@login_required
@require_POST
def generate_pdf(request):
body = json.loads(request.body)
try:
pdf = ds_client.generate(
template_id=body["templateId"],
data=body.get("data", {}),
)
return JsonResponse({
"success": True,
"data": {"url": pdf.url},
})
except Exception as e:
return JsonResponse(
{"success": False, "error": str(e)},
status=500,
)Direct Download View
File Response
import io
import httpx
from django.http import FileResponse
@login_required
def download_invoice(request, invoice_id):
invoice = Invoice.objects.get(id=invoice_id, user=request.user)
pdf = ds_client.generate(
template_id="tmpl_invoice",
data={
"invoiceNumber": invoice.number,
"customerName": invoice.customer.name,
"amount": str(invoice.total),
"items": [
{
"description": item.description,
"quantity": item.quantity,
"price": str(item.price),
}
for item in invoice.items.all()
],
},
)
response = httpx.get(pdf.url)
return FileResponse(
io.BytesIO(response.content),
content_type="application/pdf",
filename=f"invoice-{invoice.number}.pdf",
)URL Configuration
documents/urls.py
from django.urls import path
from . import views
urlpatterns = [
path("generate/", views.generate_pdf, name="generate-pdf"),
path("invoice/<int:invoice_id>/download/",
views.download_invoice, name="download-invoice"),
]Async with Celery
For heavy generation workloads, offload to a Celery task:
documents/tasks.py
from celery import shared_task
from .client import ds_client
@shared_task
def generate_pdf_async(template_id, data, notification_email=None):
pdf = ds_client.generate(
template_id=template_id,
data=data,
)
if notification_email:
# Send email with PDF link
send_pdf_email(notification_email, pdf.url)
return pdf.urlDjango REST Framework
If you use DRF, create a serializer for the request body and useAPIView instead of function-based views for better validation and error handling.Next Steps
- Python SDK — Full SDK reference
- Python SDK Advanced — Async, batching
- Flask Integration — Lightweight Python alternative