Skip to main content

A thin layer on top of FastAPI that adds some production readiness features.

Project description

prodapi

Continuous Integration Status Continuous Delivery Status Python Versions Code Coverage PyPI Package

A thin layer on top of FastAPI with the following features:

  • Integrates with FastAPI-Security to add a custom route /users/me (path is overridable)
  • Easily add CORS to your app by calling app.with_basic_cors()
  • Add health routes to the app via app.with_health_routes(). Adds a liveness route at /__is-alive and a readiness route at /__is-ready (both paths can be overridden). Useful together with Kubernetes liveness and readiness probes for example.
  • And, thanks to FastAPI, all routes are automatically added to the API documentation

Installation

pip install prodapi

Example

from prodapi import ProdAPI, ApiRouter, FastAPISecurity

# First let's set up security, via FastAPI-Security

security = FastAPISecurity()

# Set up HTTP Basic Auth
security.init_basic_auth([
    {"username": "johndoe", "password": "123"},
    {"username": "janedoe", "password": "abc123"},
])

# Set up OAuth2 and OIDC
# NOTE: There is also `init_oauth2_through_jwks` in case OIDC is not available
security.init_oauth2_through_oidc(
    "https://my-auth0-tenant.eu.auth0.com/.well-known/openid-configuration",
)

# Make sure that basic auth user `jane` and OAuth2 user
# `p56OnzZb8KrWC9paxCyv8ylyB2flTIky@clients` gets all permissions automatically.
# NOTE: For basic auth you have to set up permissions this way, for OAuth2 permissions
#       will be automatically extracted from the incoming JWT token (via the key
#       `permissions`, which might only be implemented for Auth0)
security.add_permission_overrides({
    "jane": ["*"],
    "p56OnzZb8KrWC9paxCyv8ylyB2flTIky@clients": ["*"],
)

# Now we're ready to create the app
# NOTE: ProdAPI is just a thin layer on top of `fastapi.FastAPI`
app = ProdAPI()

# CORS - Allow any origins, methods and headers. Don't expose any headers.
app.with_basic_cors()

# Add routes `/__is-alive` and `/__is-ready`. Useful together with Kubernetes or similar
# URL paths are configurable.
app.with_health_routes()

# Enable `/users/me` route to get info about the user. URL path is configurable.
app.with_user_routes(security)

# Create our app specific API router and our routes
products_router = ApiRouter()

@products_router.get("/products")
def list_products():
    return []

app.include_router(products_router)

# And we're done! Now just use uvicorn or similar to deploy.

TODO

  1. Create cli utility (using tiangolo typer?), which can generate:
    1. A stub project using prodapi
    2. Frontend (React?)
    3. docker-compose.yml and Dockerfile
    4. Kubernetes deployment files

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

prodapi-0.1.0.tar.gz (7.6 kB view hashes)

Uploaded Source

Built Distribution

prodapi-0.1.0-py3-none-any.whl (7.7 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page