переменная рендеринга Python для бутылок как текст, а не html

У меня проблемы с Python для бутылок, где у меня есть следующий код

import glob
import os
from bottle import run, route, error, template
from Find_Posts import hyperlink_postnames

currentdir = os.getcwd()

def hyperlink_postnames():
    hyperlink_filelist = []
    os.chdir(currentdir + "\\Blog_Posts\\")

    for files in glob.glob("*.txt"):
        hyperlink_filelist.append('<a href = "/blog/' + files + '"' + '>' + str(os.path.splitext(files)[0]) + '</a>')
    return  hyperlink_filelist

который возвращает следующий список

['<a href = "/blog/post1.txt">post1</a>', '<a href = "/blog/post2.txt">post2</a>', '<a href = "/blog/post3.txt">post3</a>', '<a href = "/blog/post4.txt">post4</a>', '<a href = "/blog/post5.txt">post5</a>', '<a href = "/blog/post6.txt">post6</a>']

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

@route('/blog/')
def postnames():
    postlist = hyperlink_postnames()
    tpl_out = template('blogroll', postlist = postlist)
    return  tpl_out

который загружается в шаблон blogroll.tpl:

<!DOCTYPE html>
<div>

<p><b>Blog Roll</b></p>

%for postlist in postlist:
    <li> {{ postlist }}
%end

</div>

моя проблема заключается в том, что когда я отображаю шаблон в браузере, он превращает переменную postlist в шаблоне в обычный текст, а не в html (это то, что написано внутри списка). Однако, если я изменю код бутылки, чтобы он читался так (в обход шаблона ) он отображает переменную postlist как html, но не внутри шаблона, что делает код бесполезным:

@route('/blog/')
def postnames():
    postlist = hyperlink_postnames()
    tpl_out = template('blogroll', postlist = postlist)
    return  postlist #return the variable directly bypassing the template renders the list as html

у кого-нибудь есть идеи, почему это происходит?


person Robert Lear    schedule 02.08.2012    source источник


Ответы (1)


Специальные символы HTML автоматически экранируются для предотвращения XSS-атак.

Используйте восклицательный знак в начале оператора шаблона, чтобы указать, что вы действительно хотите включить HTML:

%for postlist in postlist:
    <li> {{ !postlist }}
%end

См. документацию по встроенным операторам.

person Martijn Pieters    schedule 02.08.2012
comment
спасибо за то, что исправили проблему, все готово, просмотрел документы, должно быть, проглядел это, в отчаянии стуча по клавиатуре! - person Robert Lear; 02.08.2012