Skip to main content

Adds integration of the Chameleon template language to FastAPI.

Project description

fastapi-chameleon

Adds integration of the Chameleon template language to FastAPI. If you are interested in Jinja instead, see the sister project: github.com/AGeekInside/fastapi-jinja.

Installation

Simply pip install fastapi_chameleon.

Usage

This is easy to use. Just create a folder within your web app to hold the templates such as:

├── main.py
├── views.py
│
├── templates
│   ├── home
│   │   └── index.pt
│   └── shared
│       └── layout.pt

In the app startup, tell the library about the folder you wish to use:

import os
from pathlib import Path
import fastapi_chameleon

dev_mode = True

BASE_DIR = Path(__file__).resolve().parent
template_folder = str(BASE_DIR / 'templates')
fastapi_chameleon.global_init(template_folder, auto_reload=dev_mode)

Then just decorate the FastAPI view methods (works on sync and async methods):

@router.post('/')
@fastapi_chameleon.template('home/index.pt')
async def home_post(request: Request):
    form = await request.form()
    vm = PersonViewModel(**form) 

    return vm.dict() # {'first':'Michael', 'last':'Kennedy', ...}

The view method should return a dict to be passed as variables/values to the template.

If a fastapi.Response is returned, the template is skipped and the response along with status_code and other values is directly passed through. This is common for redirects and error responses not meant for this page template.

Friendly 404s and errors

A common technique for user-friendly sites is to use a custom HTML page for 404 responses. This is especially important in FastAPI because FastAPI returns a 404 response + JSON by default. This library has support for friendly 404 pages using the fastapi_chameleon.not_found() function.

Here's an example:

@router.get('/catalog/item/{item_id}')
@fastapi_chameleon.template('catalog/item.pt')
async def item(item_id: int):
    item = service.get_item_by_id(item_id)
    if not item:
        fastapi_chameleon.not_found()
    
    return item.dict()

This will render a 404 response with using the template file templates/errors/404.pt. You can specify another template to use for the response, but it's not required.

If you need to return errors other than Not Found (status code 404), you can use a more generic function: fastapi_chameleon.generic_error(template_file: str, status_code: int). This function will allow you to return different status codes. It's generic, thus you'll have to pass a path to your error template file as well as a status code you want the user to get in response. For example:

@router.get('/catalog/item/{item_id}')
@fastapi_chameleon.template('catalog/item.pt')
async def item(item_id: int):
    item = service.get_item_by_id(item_id)
    if not item:
        fastapi_chameleon.generic_error('errors/unauthorized.pt',
                                        fastapi.status.HTTP_401_UNAUTHORIZED)

    return item.dict()

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

fastapi_chameleon-0.1.17.tar.gz (7.3 kB view details)

Uploaded Source

Built Distribution

fastapi_chameleon-0.1.17-py3-none-any.whl (6.4 kB view details)

Uploaded Python 3

File details

Details for the file fastapi_chameleon-0.1.17.tar.gz.

File metadata

  • Download URL: fastapi_chameleon-0.1.17.tar.gz
  • Upload date:
  • Size: 7.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.6.11

File hashes

Hashes for fastapi_chameleon-0.1.17.tar.gz
Algorithm Hash digest
SHA256 25dfcf5ba11f0be61c1215df0f8dcabe9f4d766bfd8e0b763ebe64d589fc8727
MD5 1e519bd1eaa43841cf8aefd3cd3871c6
BLAKE2b-256 126e3609df5099ba4186ce8bb41d1899fbd5b41542836c7636a84e68091a02ff

See more details on using hashes here.

File details

Details for the file fastapi_chameleon-0.1.17-py3-none-any.whl.

File metadata

File hashes

Hashes for fastapi_chameleon-0.1.17-py3-none-any.whl
Algorithm Hash digest
SHA256 64a121f214e293a2596c557139fee3309b686fc1383d47e2c1646186664ba559
MD5 a8f0acc1a09a1b669dabeb7d8c94d134
BLAKE2b-256 184d3f35e91b003fa805cd42954908bf90f0d2482aa131144df9c87df79c6abf

See more details on using hashes here.

Supported by

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