Full Example

Let’s combine all of previous examples into a complete app.


FastAPI

from fastapi import FastAPI
from home.tables import Movie  # An example Table
from piccolo_admin.endpoints import create_admin
from starlette.middleware.authentication import AuthenticationMiddleware
from starlette.routing import Mount, Route

from piccolo_api.crud.endpoints import PiccoloCRUD
from piccolo_api.fastapi.endpoints import FastAPIKwargs, FastAPIWrapper
from piccolo_api.token_auth.endpoints import token_login
from piccolo_api.token_auth.middleware import (
    PiccoloTokenAuthProvider,
    TokenAuthBackend,
)
from piccolo_api.token_auth.tables import TokenAuth

public_app = FastAPI(
    routes=[
        Mount(
            "/admin/",
            create_admin(tables=[Movie, TokenAuth]),
        ),
        Route("/login/", token_login()),
    ],
)

private_app = FastAPI()

protected_app = AuthenticationMiddleware(
    private_app,
    backend=TokenAuthBackend(PiccoloTokenAuthProvider()),
)

FastAPIWrapper(
    "/movies/",
    fastapi_app=private_app,
    piccolo_crud=PiccoloCRUD(Movie, read_only=False),
    fastapi_kwargs=FastAPIKwargs(
        all_routes={"tags": ["Movie"]},
    ),
)

public_app.mount("/private", protected_app)

Starlette

Is almost identical to the FastAPI example - just replace FastAPI with Starlette, and use Starlette’s HTTPEndpoint for your endpoints. You also need to write your own crud endpoints because Starlette can’t use FastAPIWrapper. An example is in SessionAuth.