# Frameworks

> The Flask, FastAPI, and Django shims — each translates the framework-agnostic core into its own request/response idioms.

`solana_pay_kit` carries no web-framework dependency in the base install. Each shim lives in an optional submodule and delegates protocol dispatch and 402-challenge assembly to the host-neutral core, translating only the outcome into the framework's idioms. A verified `Payment` is attached to the request and its settlement headers are merged onto the success response.

<Tabs items={['Flask', 'FastAPI', 'Django']}>

<Tab value="Flask">

`pip install "solana-pay-kit[flask]"` — a `@require_payment` view decorator plus `is_paid` / `payment` accessors.

```python
from flask import Flask, jsonify
from solana_pay_kit.flask import payment, require_payment

app = Flask(__name__)


@app.get("/report")
@require_payment(report_gate)
def report():
    return jsonify(ok=True, tx=payment().transaction)
```

</Tab>

<Tab value="FastAPI">

`pip install "solana-pay-kit[fastapi]"` — a `RequirePayment` dependency for `Depends(...)`, plus `install(app)` to map `PayKitError` to a 402.

```python
from fastapi import Depends, FastAPI
from solana_pay_kit.fastapi import Payment, RequirePayment, install

app = FastAPI()
install(app)

require_report = Depends(RequirePayment(report_gate))


@app.get("/report")
async def report(payment: Payment = require_report):
    return {"ok": True, "via": payment.protocol.value}
```

FastAPI also exposes `RequireUsage` (metered `upto`) and `RequireSession` — see [Schemes](/docs/sdk/python/schemes).

</Tab>

<Tab value="Django">

`pip install "solana-pay-kit[django]"` — a `require_payment` view decorator and an optional `PaymentMiddleware` stack form.

```python
from django.http import JsonResponse
from solana_pay_kit.django import payment, require_payment


@require_payment(report_gate)
def report(request):
    return JsonResponse({"ok": True, "tx": payment(request).transaction})
```

</Tab>

</Tabs>

## Framework-agnostic core

For imperative gating inside any handler, the trio is importable from the top level:

| Function                   | Purpose                                                                  |
| -------------------------- | ------------------------------------------------------------------------ |
| `require_payment(request)` | Returns the verified `Payment`; raises `PaymentRequiredError` if unpaid. |
| `is_paid(request)`         | Predicate, never raises.                                                 |
| `get_payment(request)`     | The verified `Payment`, `None` until paid.                               |
