/fastapi-jinja

Adds integration of the Jinja template language to FastAPI.

Primary LanguagePythonMIT LicenseMIT

Test PyPI version

fastapi-jinja

Adds integration of the Jinja template language to FastAPI. This is inspired and based off fastapi-chamelon by Mike Kennedy. Check that out, if you are using chamelon.

Originall code mikeckennedy/fastapi-chameleon

Forked from AGeekInside/fastapi-jinja. The repository looks out of date, there are a few issues left.

Installation

Now, you can install fastapi-jinja using a pip

pip install fastapi-jinja

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.j2
│   └── shared
│       └── layout.j2

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

import os
import fastapi_jinja

dev_mode = True

folder = os.path.dirname(__file__)
template_folder = os.path.join(folder, 'templates')
template_folder = os.path.abspath(template_folder)

fastapi_jinja.global_init(template_folder, auto_reload=dev_mode)

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

from fastapi_jinja import template

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

    return vm.dict() # {'first':'John', 'last':'Doe', ...}

The view method should return a dict to be passed as variables/values to the template. We can also return model objects that can be converted into a dictionary, common when using libraries such as pydantic to represent models in various forms.

from fastapi_jinja import template
from pydantic import BaseModel

class Person(BaseModel):
    id: int
    name: str

@router.post("/")
@template('home/index.j2')
async def home_post(request: Request):
    form = await request.form() # form: {'id': 1, 'name': 'Jane'}
    person = Person(**form)

    return person # Person(id=1, name='Jane')

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.