> ## Documentation Index
> Fetch the complete documentation index at: https://commet.co/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Integrar con Django

> Agrega cobros y pagos a tu aplicación de Django.

Instala la Commet Skill para que tu agente integre el SDK actual y valide su trabajo contra el contrato vivo de la API.

```bash theme={null}
npx skills add commet-labs/skills --skill commet
```

<Steps>
  <Step title="Instalar">
    <Tabs>
      <Tab title="pip">
        ```bash theme={null}
        pip install commet-sdk django
        ```
      </Tab>

      <Tab title="uv">
        ```bash theme={null}
        uv add commet-sdk django
        ```
      </Tab>

      <Tab title="poetry">
        ```bash theme={null}
        poetry add commet-sdk django
        ```
      </Tab>
    </Tabs>
  </Step>

  <Step title="Configurar">
    ```bash title=".env" theme={null}
    COMMET_API_KEY=ck_sandbox_xxx
    ```

    ```python title="billing/commet_client.py" theme={null}
    import os
    from commet import Commet

    commet = Commet(
        api_key=os.environ["COMMET_API_KEY"],
    )
    ```
  </Step>

  <Step title="Suscribir">
    ```python title="billing/views.py" theme={null}
    import json
    from django.http import JsonResponse
    from django.views.decorators.http import require_POST
    from .commet_client import commet


    @require_POST
    def subscribe(request):
        data = json.loads(request.body)

        commet.customers.create(
            email=data["email"],
            id=data["customer_id"],
        )

        subscription = commet.subscriptions.create(
            customer_id=data["customer_id"],
            plan_code="pro",
        )

        return JsonResponse({"checkout_url": subscription.checkout_url})
    ```
  </Step>

  <Step title="Verificar acceso">
    ```python title="billing/views.py" theme={null}
    def get_subscription(request, customer_id):
        sub = commet.subscriptions.get_active(customer_id=customer_id)
        if sub is None:
            return JsonResponse({"error": "no_active_subscription"}, status=404)
        return JsonResponse({"status": sub.status})


    def check_feature(request, feature, customer_id):
        result = commet.feature_access.get(code=feature, customer_id=customer_id)
        return JsonResponse({"allowed": result.allowed})
    ```
  </Step>

  <Step title="Trackear uso">
    ```python title="billing/views.py" theme={null}
    @require_POST
    def track_usage(request):
        data = json.loads(request.body)

        commet.usage.track(
            customer_id=data["customer_id"],
            feature_code="api_calls",
            value=1,
        )

        return JsonResponse({"tracked": True})
    ```

    El uso se agrega y se cobra al final del período.
  </Step>

  <Step title="Portal del Cliente">
    ```python title="billing/views.py" theme={null}
    from django.shortcuts import redirect


    def portal(request):
        result = commet.portal.get_url(customer_id="user_123")
        return redirect(result.portal_url)
    ```
  </Step>

  <Step title="Webhooks">
    ```python title="billing/views.py" theme={null}
    import os

    from django.views.decorators.csrf import csrf_exempt
    from commet import Webhooks

    webhooks = Webhooks()


    @csrf_exempt
    @require_POST
    def handle_webhook(request):
        payload = webhooks.verify_and_parse(
            raw_body=request.body.decode(),
            signature=request.headers.get("x-commet-signature"),
            secret=os.environ["COMMET_WEBHOOK_SECRET"],
        )

        if payload is None:
            return JsonResponse({"error": "Invalid signature"}, status=401)

        if payload["event"] == "subscription.activated":
            # manejar activación
            pass

        return JsonResponse({"ok": True})
    ```
  </Step>

  <Step title="URLs">
    ```python title="billing/urls.py" theme={null}
    from django.urls import path
    from . import views

    urlpatterns = [
        path("subscribe", views.subscribe),
        path("subscription/<str:customer_id>", views.get_subscription),
        path("features/<str:feature>/<str:customer_id>", views.check_feature),
        path("usage", views.track_usage),
        path("portal", views.portal),
        path("webhooks/commet", views.handle_webhook),
    ]
    ```

    ```python title="project/urls.py" theme={null}
    from django.urls import path, include

    urlpatterns = [
        path("billing/", include("billing.urls")),
    ]
    ```
  </Step>
</Steps>

## Relacionado

* [Suscripciones](/docs/es/manage-subscriptions)
* [Trackear Uso](/docs/es/track-usage)
* [Portal del Cliente](/docs/es/customer-portal)
* [Referencia del SDK](/docs/es/sdk-reference)


## Related topics

- [Integrar con Python](/docs/es/integrate-with-python.md)
- [Integrar con Flask](/docs/es/integrate-with-flask.md)
- [Integrar con Java](/docs/es/integrate-with-java.md)
- [Integrar con Encore](/docs/es/integrate-with-encore.md)
- [Integrar con Laravel](/docs/es/integrate-with-laravel.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.