Reputation: 63984
I am using Jinja purely for creating template. Here is the scheme I have:
page1.html
{% extends "base.html" %}
{% block body %}
<div class="container">
<img src="./images/{{svg_name}}" style="padding-top:100px; padding-left:100px" align="center" width="60%" heig
</div>
{% endblock %}
base.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="../src/bootstrap.min.css">
<link rel="stylesheet" type="text/css" href="../src/sticky-footer-navbar.css">
<link rel="icon" href="../images/favicon.ico">
<title>MY TITLE</title>
</head>
<body>
<!-- Fixed navbar -->
<nav class="navbar navbar-default navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="../index.html">Adjuvant</a>
</div>
<div id="navbar" class="collapse navbar-collapse">
<ul class="nav navbar-nav">
<li class="active"><a href="../index.html">Home</a></li>
<li><a href="#about">About</a></li>
<li><a href="mailto:[email protected]">Contact</a></li>
</ul>
</div><!--/.nav-collapse -->
</div>
</nav>
<!-- End navbar -->
<!--- BEGIN INSERT TEMPLATE FOR OTHER PAGE HERE-->
{% block 'body' %}
{% endblock %}
<!--- END TEMPLATE FOR OTHER PAGE HERE-->
<footer class="footer">
<div class="container">
<p class="text-muted"> © 2015 ·
</p>
</div>
</footer>
<!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="../src/jquery-1.11.0.min.js"><\/script>')</script>
<script src="../src/bootstrap.min.js"></script>
<!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
<script src="../src/ie10-viewport-bug-workaround.js"></script>
</body>
</html>
code_to_make_template.py
from jinja2 import Template, FileSystemLoader
from jinja2.environment import Environment
env = Environment()
env.loader = FileSystemLoader('.')
template = env.get_template("htmls/src/templates/page1.html")
output_string = template.render(svg_name=filename)
The directory structure looks like this:
current_dir
|___ code_to_make_template.py
|___ html
|_ src
|_ templates
|_ base.html
|_ page1.html
But when I run code_to_make_template.py
I got this message:
jinja2.exceptions.TemplateNotFound: base.html
What's the right way to do it?
Upvotes: 3
Views: 4666
Reputation: 10283
This is what I would do:
import os
import webapp2
import jinja2
template_dir = os.path.join(os.path.dirname(__file__), 'html/src/templates')
jinja_env = jinja2.Environment(loader = jinja2.FileSystemLoader(template_dir),
autoescape = True)
def render_str(template, **params):
t = jinja_env.get_template(template)
return t.render(params)
class MainHandler(webapp2.RequestHandler):
def write(self, *a, **kw):
self.response.out.write(*a, **kw)
def render_str(self, template, **params):
return render_str(template, **params)
def render(self, template, **kw):
self.write(self.render_str(template, **kw))
Then you just inherit that class in your rendering classes and do:
class PageOne(MainHandler):
def get(self):
self.render('page1.html')
app = webapp2.WSGIApplication([('/page_one', PageOne)
],debug=True)
Upvotes: 3