Вставлять статические файлы буквально в шаблоны Jinja без их разбора - программирование
Подтвердить что ты не робот

Вставлять статические файлы буквально в шаблоны Jinja без их разбора

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

Короче говоря, несмотря на то, что файл и экранирование всех символов, что я могу сделать, чтобы сказать Jinja просто включить файл как?

4b9b3361

Ответ 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') }}