Document Stack
Document Stack
Docs

Django Integration

Generate PDF documents from Django applications using the Document Stack Python SDK.

Installation

Bash
pip install document-stack

Add 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.url

Django REST Framework

If you use DRF, create a serializer for the request body and use APIView instead of function-based views for better validation and error handling.

Next Steps