Inserte archivos estáticos literalmente en las plantillas de Jinja sin analizarlos

Estoy tratando de insertar un archivo en una página usando Jinja 2.6 usando la etiqueta de include . Esto funcionó bien hasta que comencé a usar caracteres en el archivo que recuerdan la syntax de Jinja, momento en el que se dio cuenta de que no podía analizarlos y bombardearlos.

Aparte de revisar el archivo y escapar de todos los caracteres, ¿qué puedo hacer para decirle a Jinja que solo incluya el archivo tal como está?

Puede definir una función para cargar el archivo de texto y representarlo en la plantilla:

 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() 

En la plantilla, llámalo así:

 {{ include_file('file.txt') }} 

Si está utilizando Flask puede escribirse así:

 from jinja2 import Markup ... app.jinja_env.globals['include_raw'] = lambda filename : Markup(app.jinja_loader.get_source(app.jinja_env, filename)[0]) 

Y usado así:

 {{ include_raw('js-inline/modernizr.min.js') }} 

La ruta del archivo incluido es relativa a la carpeta de su plantilla, ya que para la normal incluye.

Intente colocar la syntax en los otros archivos en {% raw %} {% endraw %}

Puede usar jQuery si no desea editar los archivos externos: Haga una inmersión para contener el contenido

y use jquery para cargar el archivo: $("#contentoffile").load("url to file") << << la url puede ser relativa

Como actualización de la respuesta de @ Alex, puede usar el decorador @contextfunction de Jinja para eliminar parte de la dependencia de las variables globales. El código actualizado se vería así:

 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() 

Y como antes, llámalo desde tu plantilla como:

 {{ include_file('file.txt') }}