2

次のコードがあるボトル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

なぜこれが起こっているのかについて誰かが何か考えを持っていますか?

4

1 に答える 1

8

XSS攻撃を防ぐために、HTMLの特殊文字は自動的にエスケープされます。

テンプレートステートメントの先頭に感嘆符を使用して、本当にHTMLを含めたいことを示します。

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

インラインステートメントに関するドキュメントを参照してください。

于 2012-08-02T14:06:51.017 に答える