Jinja2 templates are text files that contain placeholders and control structures. Placeholders, also known as variables, are used to insert dynamic data into the template. Control structures, such as loops and conditional statements, allow you to generate dynamic content based on certain conditions.
Flask has built - in support for Jinja2 templates. You can use the render_template
function to render a Jinja2 template and pass variables to it. The render_template
function looks for templates in the templates
directory by default.
Jinja2 supports template inheritance, which allows you to create a base template with common elements (such as headers, footers, and navigation bars) and then extend this base template in child templates. This helps in reducing code duplication and maintaining a consistent look and feel across your application.
One of the most common use cases is to generate dynamic web pages. You can pass data from your Flask application to the Jinja2 template, and the template will render the data in a user - friendly format. For example, you can display a list of products on an e - commerce website.
Jinja2 templates can be used to render HTML forms. You can pass form data and validation errors to the template, and the template will display the form with appropriate error messages if necessary.
You can use Jinja2 templates to generate email content. By passing dynamic data such as user names and order details to the template, you can create personalized email messages.
# Import Flask and render_template
from flask import Flask, render_template
# Create a Flask application instance
app = Flask(__name__)
# Define a route
@app.route('/')
def index():
# Define a variable
name = "John"
# Render the template and pass the variable
return render_template('index.html', name=name)
if __name__ == '__main__':
app.run(debug=True)
In the templates
directory, create an index.html
file:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF - 8">
<title>Home</title>
</head>
<body>
<h1>Hello, {{ name }}!</h1>
</body>
</html>
# Import Flask and render_template
from flask import Flask, render_template
# Create a Flask application instance
app = Flask(__name__)
# Define a route for the home page
@app.route('/')
def index():
return render_template('index.html')
# Define a route for the about page
@app.route('/about')
def about():
return render_template('about.html')
if __name__ == '__main__':
app.run(debug=True)
Create a base.html
template in the templates
directory:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF - 8">
<title>{% block title %}Default Title{% endblock %}</title>
</head>
<body>
<header>
<nav>
<ul>
<li><a href="/">Home</a></li>
<li><a href="/about">About</a></li>
</ul>
</nav>
</header>
<main>
{% block content %}
<!-- Default content goes here -->
{% endblock %}
</main>
<footer>
<p>© 2024 All rights reserved</p>
</footer>
</body>
</html>
Create an index.html
template:
{% extends "base.html" %}
{% block title %}Home Page{% endblock %}
{% block content %}
<h1>Welcome to the Home Page</h1>
<p>This is the home page content.</p>
{% endblock %}
Create an about.html
template:
{% extends "base.html" %}
{% block title %}About Page{% endblock %}
{% block content %}
<h1>About Us</h1>
<p>We are a team of developers passionate about building great web applications.</p>
{% endblock %}
If you place your templates in a directory other than the default templates
directory, Flask will not be able to find them. Make sure to either use the default directory or configure Flask to look for templates in a custom directory.
Be careful with variable scope in Jinja2 templates. Variables defined inside a loop or a conditional statement may not be accessible outside of that block.
If you directly insert user - input data into a template without proper sanitization, it can lead to security vulnerabilities such as cross - site scripting (XSS). Always use Jinja2’s built - in filters to sanitize user input.
As shown in the code examples, template inheritance helps in reducing code duplication and maintaining a consistent layout across your application.
Avoid putting too much logic in your templates. Keep the presentation logic in the templates and the business logic in your Flask application.
Use Jinja2 filters such as safe
, escape
, and striptags
to sanitize user - input data before inserting it into the template.
Using Jinja2 templates in Flask is a powerful way to separate the presentation logic from the application logic, making your codebase more maintainable and easier to understand. By understanding the core concepts, typical usage scenarios, common pitfalls, and best practices, you can effectively use Jinja2 templates in your Flask applications. Whether you are building a simple web page or a complex e - commerce website, Jinja2 templates can help you create dynamic and user - friendly interfaces.