瓶python渲染变量作为文本而不是html

时间:2012-08-02 14:03:40

标签: python bottle

我遇到了瓶子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

有没有人对于为什么会发生这种情况有任何想法?

1 个答案:

答案 0 :(得分:7)

HTML特殊字符会自动转义以防止XSS攻击。

在模板语句的开头使用感叹号表示您确实要包含HTML:

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

请参阅documentation on inline statements