3
votes

(UPDATE: I've made a better question with a better answer here. I was going to delete this question, but some of the answers might prove useful to future searchers.)

My question is just about identical to this, but that answer is ugly (requires a dir structure including sharedtemplates/templates/templates/), incomplete as posted (user "answered" his own question), and assumes some knowledge I don't have.

I'm working on my first python-backed web application. The javascript component is well under development using a static HTML page. Now I want a server-side python component to handle AJAX calls and render an HTML template using jinja2.

I've had success with python before, creating GUI apps using tkinter/requests. Love the language, but the python environment (environments?) is confusing. I'm not working in a virtualenv.

According to jinja2 docs, HTML templates have to be in something called a package. Then you create an Environment with a PackageLoader that knows the name of the package and the template dir:

from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader('yourapplication', 'templates'))

So, here's my index.py (it's just a stub and doesn't even try to render anything, but you can at least tell if it crashes).

#!/usr/bin/python
from jinja2 import Environment, PackageLoader # no prob, jinja2 correctly installed using pip

env = Environment(loader=PackageLoader('mypkg', 'template')) # causes server error

# if it doesn't crash, just put up a basic html page for now
print ("Content-type: text/html\r\n\r\n")
print("<html><head><title>hello</title></head><body>hello wuld</body></html>")

Here's the directory structure:

index.py
mypkg/
mypkg/template/index.html
mypkg/__init__.py  # empty

Relevant line from error log:

ImportError: No module named mypkg

Maybe I need to structure this differently, and I'm pretty sure I'll need to create and invoke a setup.py to install the module. That's part of what the other answer left out: what's in setup.py and how does it work in this case? I've looked at dozens of resources on setup.py and none of them seems to pertain to the question of installing HTML templates.

Thanks in advance for your help!

UPDATE: fragilewindows pointed to a resource that tells about "developer mode", which is probably part of the answer. The difficulty here is, I'm looking to package this template for local deployment, not for distribution. But 99% of the online documentation is about packaging projects for PyPi. I don't need to package a "project", just a dinky HTML template. Indeed, the only reason I need to package the template is because that's the default way for jinja2 to access templates (and I do want to go native in python).

I just need to convince the environment that "mypkg" is installed, and that "template" is a directory within the install. You can see that my efforts so far are naive; I expect the right answer will be correspondingly lightweight.

3

3 Answers

7
votes

I've discovered a WORKAROUND, here. In this usage, the template is not part of a module or package; it is loaded directly from the file system. File system:

./index.py
./template.html

index.py:

#!/usr/bin/python
import jinja2

templateLoader = jinja2.FileSystemLoader( searchpath="." )
templateEnv = jinja2.Environment( loader=templateLoader )
TEMPLATE_FILE = "template.html"
template = templateEnv.get_template( TEMPLATE_FILE )
outputText = template.render( ) # this is where to put args to the template renderer

print ("Content-type: text/html\r\n\r\n")
print(outputText)
1
votes

I don't know the process involved with packaging but I figure since Jinja2 is written in Python, the process would be the same as packaging any other application in Python.

Here are a few links that may be useful to you:

I hope this helps.

0
votes

Maybe an issue is in PYTHONPATH . According to Python documantation https://docs.python.org/2.7/tutorial/modules.html#the-module-search-path it searches for modules in :

  • the directory containing the input script (or the current directory).
  • PYTHONPATH (a list of directory names, with the same syntax as the shell variable PATH).
  • the installation-dependent default.

You can add some code to your application - printing sys.path variable to make sure your applcation's path is also there.

import sys
from jinja2 import Environment, PackageLoader # no prob, jinja2 correctly installed using pip
print sys.path # printing your sys.path
env = Environment(loader=PackageLoader('mypkg', 'template')) # causes server error

If it's not You can add by

sys.path.append(path_to_your_application)