/ / HTML шаблонування за допомогою Jinja2 - Lost - python, html, шаблони, jinja2

Шаблон HTML за допомогою Jinja2 - Lost - python, html, templates, jinja2

Я намагаюся створити html шаблон у python, використовуючи Jinja2. У мене є папка шаблонів з моїм "template.html", але я не знаю, як мати справу з середовищем або пакувальниками.

Я встановив Jinja2 за допомогою easy_python і запустив наступний сценарій.

from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader("yourapplication", "templates"))
template = env.get_template("mytemplate.html")
print template.render()

Я отримую наступну помилку, тому що я не знаю, як визначити пакет / модуль. Будь ласка, допоможіть мені, я просто хочу створити простий шаблон.

  File "log_manipulationLL.py", line 291, in <module>
env = Environment(loader=PackageLoader("yourapplication", "templates"))
File "/usr/local/lib/python2.7/dist-packages/Jinja2-2.6-py2.7.egg/jinja2/loaders.py",    line 216, in __init__
provider = get_provider(package_name)
File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 213, in get_provider
__import__(moduleOrReq)
ImportError: No module named yourapplication

Відповіді:

8 для відповіді № 1

PackageLoader очікує фактичний модуль Python, використовуючи звичайний синтаксис точок. Наприклад, якщо ваша структура виглядає так:

myapp/
__init__.py
…
templates/
mytemplate.html

Ви повинні використовувати myapp як ім'я модуля.


9 для відповіді № 2

Якщо ви не хочете або не потребуєте пакета Python, ви, ймовірно, повинні використовувати a FileSystemLoader замість цього:

from jinja2 import Environment, FileSystemLoader, select_autoescape
env = Environment(
loader=FileSystemLoader("file/path/"),
autoescape=select_autoescape(["html", "xml"]),
)

8 за відповідь № 3

Я вирішив цю проблему, використовуючи наступний код:

 env = Environment(loader=PackageLoader("scriptname",
templatesPath))

де цей код входить до файлу scriptname.py.

Я не впевнений, що моя відповідь є актуальною, але мені було цікаво, що, можливо, хтось може знайти цю відповідь корисною. Якщо я помиляюся, будь ласка, дайте мені знати.


2 для відповіді № 4

PackageLoader визначається так:

class PackageLoader(BaseLoader):
"""Load templates from python eggs or packages.  It is constructed with
the name of the python package and the path to the templates in that
package::

loader = PackageLoader("mypackage", "views")

If the package path is not given, ``"templates"`` is assumed.

Per default the template encoding is ``"utf-8"`` which can be changed
by setting the `encoding` parameter to something else.  Due to the nature
of eggs it"s only possible to reload templates if the package was loaded
from the file system and not a zip file.
"""

І тоді __init__() Метод такий:

def __init__(self, package_name, package_path="templates",
encoding="utf-8"):

Це спонукає нас помітити, що така структура:

myapp/
__init__.py
...
templates/
mytemplate.html

Буде мати те ж саме PackageLoader інстанції з обома цими деклараціями:

PackageLoader("myapp")
PackageLoader("myapp", "templates")

І так, якщо ви працюєте з myapp/ шлях, то вам просто потрібно сказати:

PackageLoader("templates", "")

Так що це буде просто брати templates/ як шлях. Якщо залишити другий аргумент порожнім, він спробує знайти шаблони в templates/templates.

Нарешті, ви можете перевірити, що було завантажено за допомогою list_templates() спосіб:

PackageLoader("templates", "").list_templates()