2012-03-19 18 views
16

Próbuję wstawić plik na stronę za pomocą Jinja 2.6, używając znacznika include. To działało dobrze, dopóki nie zacząłem używać znaków w pliku, które przypominają składnię Jinja, w którym to momencie zdało sobie sprawę, że nie można ich przetworzyć i zbombardować.Wstawianie statycznych plików dosłownie do szablonów Jinja bez analizowania ich.

Krótko mówiąc, plik i ucieczka od wszystkich znaków, co mogę zrobić, aby powiedzieć Jinji, aby po prostu dołączyć plik?

+1

W celu wyjaśnienia, plik zewnętrzny jest zestaw wąsów javascript szablony, które są wykorzystywane w wiele miejsc. Nie chcę ich modyfikować - wystarczy uwzględnić je tak, jak w źródle HTML. –

Odpowiedz

17

można zdefiniować funkcję, aby załadować plik tekstowy i uczynić go w szablonie:

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

W szablonie, nazwać tak:

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

Dzięki ... Miałem nadzieję, że istnieje wbudowana metoda lub wtyczka, której brakowało, ale ja po prostu pójdę z tym. –

+0

Witaj, Alex Nie otrzymałem danych wyjściowych podczas używania twojego kodu, ponieważ użycie jakiegoś parametru jest niezdefiniowane. "(loader.get_source (env, name)" Czy możesz wyjaśnić w szczegółach: – cSharma

4

Spróbuj umieścić składni w innych plikach w {% raw %} {% endraw %}

Można użyć jQuery, jeśli nie chcesz, aby edytować pliki zewnętrzne: Zrób nurkowanie zawierać zawartości <div id="contentoffile"></div>

i użyć jQuery załadować plik: $("#contentoffile").load("url to file") < < URL może być względny

+0

To działa, ale chodzi o to, że nie chcę modyfikować dołączonych plików. Są zewnętrzne i używane w innych miejscach. –

+1

Dzięki za podpowiedź z ajaxem ... Próbuję jednak uniknąć dodatkowej prośby. Nie widzę powodu, dla którego potrzebuję wykonać kolejną obietę, gdy pliki są właśnie tam, gdy szablon jest renderowany. –

9

Jeśli używasz kolba może być napisane tak:

from jinja2 import Markup 

... 

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

i używane tak:

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

Ścieżka dołączonego pliku odnosi się do folderu szablonu, tak jak w przypadku zwykłego uwzględnienia.

1

Jako aktualizację odpowiedzi @ Alex, można użyć dekoratora Jinja, @contextfunction, aby usunąć pewne zależności od zmiennych globalnych. Zaktualizowany kod wyglądałby następująco:

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

i tak jak poprzednio, wywołać ją od szablonu jak:

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

, ale nie przekazujesz parametru "ctx" z metody?!? – cSharma

+0

Dostarcza go dekorator '@ contextfunction'. [Docs] (http: //jinja.pocoo.org/docs/dev/api/#jinja2.contextfunction) – lsowen

+0

Kiedy wywołuję funkcję, zgłaszam błąd, ponieważ potrzebny jest jeszcze jeden parametr ... – cSharma

Powiązane problemy