Вставлять статические файлы буквально в шаблоны Jinja без их разбора
Я пытаюсь вставить файл на страницу с помощью Jinja 2.6, используя тег include
. Это работало нормально, пока я не начал использовать символы в файле, которые напоминают синтаксис Jinja, и в этот момент он понял, что не может разобрать их и бомбить.
Короче говоря, несмотря на то, что файл и экранирование всех символов, что я могу сделать, чтобы сказать Jinja просто включить файл как?
Ответы
Ответ 1
Вы можете определить функцию для загрузки текстового файла и отображения его в шаблоне:
import jinja2
def include_file(name):
return jinja2.Markup(loader.get_source(env, name)[0])
loader = jinja2.PackageLoader(__name__, 'templates')
env = jinja2.Environment(loader=loader)
env.globals['include_file'] = include_file
def render():
return env.get_template('page.html').render()
if __name__ == '__main__':
print render()
В шаблоне вызовите его так:
{{ include_file('file.txt') }}
Ответ 2
Если вы используете Flask, его можно записать следующим образом:
from jinja2 import Markup
...
app.jinja_env.globals['include_raw'] = lambda filename : Markup(app.jinja_loader.get_source(app.jinja_env, filename)[0])
И используется так:
{{ include_raw('js-inline/modernizr.min.js') }}
Путь к включенному файлу относится к папке вашего шаблона, как и для обычных.
Ответ 3
Попробуйте добавить синтаксис в другие файлы в {% raw %} {% endraw %}
Вы можете использовать jQuery, если вы не хотите редактировать внешние файлы:
Сделайте погружение для содержания содержимого <div id="contentoffile"></div>
и использовать jquery для загрузки файла: $("#contentoffile").load("url to file")
< < url может быть относительным
Ответ 4
В качестве обновления для ответа @Alex вы можете использовать Jinja @contextfunction
decorator, чтобы удалить часть зависимости от глобальных переменных. Обновленный код будет выглядеть так:
import jinja2
@jinja.contextfunction
def include_file(ctx, name):
env = ctx.environment
return jinja2.Markup(env.loader.get_source(env, name)[0])
def main():
loader = jinja2.PackageLoader(__name__, 'templates')
env = jinja2.Environment(loader=loader)
env.globals['include_file'] = include_file
env.get_template('page.html').render()
if __name__ == '__main__':
print main()
И как и прежде, вызовите его из своего шаблона, например:
{{ include_file('file.txt') }}