2 votes

bouteille python rendant une variable en tant que texte et non en html

J'ai un problème avec bottle python où j'ai le code suivant

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

qui renvoie la liste suivante

['<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>']

qui est à son tour alimenté par la route du biberon suivante :

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

qui est introduit dans le modèle blogroll.tpl :

<!DOCTYPE html>
<div>

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

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

</div>

mon problème est que lorsque je rends le modèle dans le navigateur, il transforme la variable postlist dans le modèle en texte brut et non en html (ce qui est écrit à l'intérieur de la liste), Cependant, si je change le code de la bouteille pour qu'il se lise comme ceci (en contournant le modèle), il rend la variable postlist en html mais pas à l'intérieur du modèle, ce qui rend le code inutile :

@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

Quelqu'un a-t-il une idée de la raison pour laquelle cela se produit ?

8voto

Martijn Pieters Points 271458

Les caractères spéciaux HTML sont automatiquement échappés pour éviter les attaques XSS.

Utilisez un point d'exclamation au début de votre déclaration de modèle pour indiquer que vous voulez vraiment inclure du HTML :

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

Voir le documentation sur les déclarations en ligne .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X