Jinja Integration
=======================
`Jinja2 `_ is one of the most popular templating engines for Python, and is packaged with Flask. Flask-Philo provides a number of additional methods to facilitate common calls to the Jinja2 engine
* **init_jinja2()** - A single initialisation function to bootstrap the core Jinja2 components
* **get_manager()** - Creates an instance of Flask-Philo's TemplatesManage class, facilitating multiple template loaders
* **set_request()** - append a request object to an Environment's global objects
* **get_autoescaping_params()** - fetch a custom set of AutoEscaping rules from the Flask-Philo configuration file
* **load_extensions_from_config()** - Specify a custom set of Jinja2 extensions from our application's configuration file
* **init_filesystem_loader()** - Configures the Jinja2 FileSystemLoader with paths and parameters specified in our Flask-Philo configuration file
init_jinja2
#############
Single initialisation function that uses Flask-Philo's app configuration file (``/src/config/development.py``) to bootstrap the following Jinja2 components:
* Filesystem Loader
* Template Loader
* Autoescaping
* Extensions
*config/development.py* :
::
JINJA2_TEMPLATES = {
'DEFAULT': {
'LOADER': 'FileSystemLoader',
'PARAMETERS': {
'path': (
os.path.join(BASE_DIR, '../', '_templates'),
),
'encoding': 'utf-8',
'followlinks': False
},
'AUTOESCAPING': {
'enabled_extensions': ('html', 'htm', 'xml'),
'disabled_extensions': [],
'default_for_string': True,
'default': False
},
'EXTENSIONS': (
'tests.test_app.templatetags.TestExtension',
)
}
}
Example Python code :
::
from flask_philo import app
from flask import g
init_jinja2(g, app)
assert hasattr(app, 'jinja_env')
assert hasattr(app, 'jinja_options')
assert hasattr(app, 'jinja_loader')
assert hasattr(app, 'jinja_environment')
get_manager
###########
Creates an instance of Flask-Philo's TemplatesManager class, facilitating multiple template loaders
``get_manager()``
Example Python calling code :
::
from flask_philo.jinja2 import get_manager
# instantiate manager, and render html from template
manager = get_manager()
env = manager.environments['DEFAULT']
template = env.get_template('home.html')
output_html = template.render()
set_request
###########
Jinja2 uses a central object called the template *Environment*. Instances of this class are used to store the configuration and
global objects, and are used to load templates from the file system or other locations.
To append a request object to an Environment's global objects, use the ``set_request()`` method
Example Python calling code :
::
from flask_philo import app
from flask_philo.jinja2 import get_manager
manager = get_manager()
ctx = app.test_request_context('/hello-template')
manager.set_request(ctx.request)
env = manager.environments['DEFAULT']
get_autoescaping_params
#################
Flask-Philo allows us to specify a custom set of AutoEscaping rules in our application's configuration file (e.g. ``/src/config/development.py``).
These AutoEscaping rules may then used as part of our Environment instance
*config/development.py* :
::
JINJA2_TEMPLATES = {
'DEFAULT': {
'AUTOESCAPING': {
'enabled_extensions': ('html', 'htm', 'xml'),
'disabled_extensions': [],
'default_for_string': True,
'default': False
}
}
}
Example Python code :
::
from flask_philo.jinja2 import get_autoescaping_params
params = get_autoescaping_params(**app.config)
env = Environment(
autoescape=select_autoescape(**params),
)
load_extensions_from_config
###########################
Flask-Philo allows us to specify a custom set of Jinja2 extensions in our application's configuration file (e.g. ``/src/config/development.py``).
These extensions are then used to instantiate of our Environment instance
For more detail on Jinja2 extensions, refer to `the extensions documentation `_
*config/development.py* :
::
JINJA2_TEMPLATES = {
'DEFAULT': {
'EXTENSIONS': (
'tests.test_app.templatetags.TestExtension',
)
}
}
Example Python code :
::
from flask_philo import app
env_extensions = load_extensions_from_config(app.config)
env = Environment(
extensions=load_extensions_from_config(**env_extensions)
)
init_filesystem_loader
############################
Configures the Jinja2 FileSystemLoader (`docs here `_) with paths and parameters specified in our Flask-Philo configuration file ``/src/config/development.py``
Also instantiates and returns a Jinja2 Environment based on this configuration.
*config/development.py* :
::
JINJA2_TEMPLATES = {
'DEFAULT': {
'LOADER': 'FileSystemLoader',
'PARAMETERS': {
'path': (
os.path.join(BASE_DIR, '../', '_templates'),
),
'encoding': 'utf-8',
'followlinks': False
},
}
}
Example Python code :
::
from flask_philo import app
config = app.config['JINJA2_TEMPLATES']['DEFAULT']
env = init_filesystem_loader(**config)
template = env.get_template('home.html')
txt = template.render()
assert 'random_msg hello world!!!' == txt