Вставьте статические файлы буквально в шаблоны Jinja, не анализируя их - PullRequest
16 голосов
/ 19 марта 2012

Я пытаюсь вставить файл на страницу, используя Jinja 2.6, используя тег include. Это работало нормально, пока я не начал использовать символы в файле, которые напоминают синтаксис Jinja, после чего он понял, что не может их проанализировать, и взорвался.

Если не считать файл и не экранировать все символы, что я могу сделать, чтобы попросить Джинджу просто включить файл как есть?

Ответы [ 4 ]

18 голосов
/ 19 марта 2012

Вы можете определить функцию для загрузки текстового файла и визуализации его в шаблоне:

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') }}
9 голосов
/ 24 апреля 2014

Если вы используете 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') }}

Путь к включенному файлу относительно вашей папки шаблона:для нормальных включает.

4 голосов
/ 19 марта 2012

Попробуйте добавить синтаксис в другие файлы в {% raw %} {% endraw %}

Вы можете использовать jQuery, если вы не хотите редактировать внешние файлы: Сделать погружение, чтобы содержать содержание <div id="contentoffile"></div>

и используйте jquery для загрузки файла: $("#contentoffile").load("url to file") << URL может быть относительным </p>

1 голос
/ 31 декабря 2016

В качестве обновления к ответу @ Alex вы можете использовать декоратор Jinja @contextfunction, чтобы удалить некоторую зависимость от глобальных переменных.Обновленный код будет выглядеть так:

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') }}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...