Как избежать экранирования html-символов в веб-фреймворке python для бутылок?

Вопрос

Как я могу предотвратить экранирование символов в программе Bottle – Python Web Framework ?

Задний план

Я делаю текст песни webapp в Bottle (python), и я тестирую все данные правильно, прежде чем вставлять их в базу данных, поэтому на данный момент у меня в основном есть форма, в которой есть «имя песни», «artist »,« lyrics »(в текстовом поле) и все.

Когда форма отправляет его, загружается страница, содержащая три входных значения, упомянутые выше (песня, исполнитель и тексты песен), и все работает так, как ожидалось, но html-текст песни ускользает (перед тем, как отправить текст в шаблон, я заменил все \n с.).

Таким образом, я сделал свое исследование и из этого урока от bottpy.org и обнаружил, что Bottle избегает html-тегов, чтобы предотвратить атаки XSS, и вы можете отключить это, поставив «!» перед именем переменной AWESOME! Я нашел решение, но … когда я пытался его использовать, он сделал ошибку:

Ошибка – Снимок экрана с ошибкой на компьютере

 Exception: SyntaxError('invalid syntax', ('H:\\Server\\htdocs\\letras\\prueba.tpl', 4, 27, "u'<div>Letra: ', _escape( !letra['letra'] ), u'</div>'])\n")) Traceback (most recent call last): File "H:\Server\htdocs\letras\bottle.py", line 764, in _handle return route.call(**args) File "H:\Server\htdocs\letras\bottle.py", line 1575, in wrapper rv = callback(*a, **ka) File "index.py", line 41, in guardar_letra return template('prueba.tpl', letra = data) File "H:\Server\htdocs\letras\bottle.py", line 3117, in template return TEMPLATES[tplid].render(kwargs) File "H:\Server\htdocs\letras\bottle.py", line 3090, in render self.execute(stdout, kwargs) File "H:\Server\htdocs\letras\bottle.py", line 3078, in execute eval(self.co, env) File "H:\Server\htdocs\letras\bottle.py", line 185, in __get__ value = obj.__dict__[self.func.__name__] = self.func(obj) File "H:\Server\htdocs\letras\bottle.py", line 2977, in co return compile(self.code, self.filename or '<string>', 'exec') File "H:\Server\htdocs\letras\prueba.tpl", line 4 u'<div>Letra: ', _escape( !letra['letra'] ), u'</div>']) ^ SyntaxError: invalid syntax 

index.py- gist на github

 from bottle import Bottle, route, run, template, static_file, get, post, request, response from passlib.hash import sha256_crypt import MySQLdb as mdb import time import re @get('/enviar') def enviar_letra(): return template('enviar_letra.tpl') @post('/enviar') def guardar_letra(): titulo = request.forms.get('titulo').capitalize() # Gets the song title from the form artista = request.forms.get('artista') # Gets the artist letra = request.forms.get('letra') # Gets the lyrics fecha_envio = time.strftime('%Y-%m-%d %H:%M:%S') # Date the lyrics were sent titulo = re.sub('[^\w|!|\s|\.|,]', '', titulo) # I delete every character except: words, exclamation, spaces, dots, commas url = titulo + "-" + artista # concatenate the song's title and the artist name to make a nice url url = re.sub('\W+|_', '-', url).lower() # lower all the characters from the url url = url.strip("-") # strips "-" at the beginning and the end letra = letra.replace("\n", "<br>") # replaces \n from the lyrics text area with <br> data = { "titulo": titulo, "artista": artista, "letra": letra, "url": url, "Fecha_envio": fecha_envio } # song dictionary return template('prueba.tpl', letra = data) # loads prueba.tpl template and send "data" dictionary as "letra" (letra is lyric in spanish) run(host='localhost', port=8080, debug=True) 

HTML-шаблон для github

 <h1>Letra de {{ letra['titulo'] }}</h1> <h2>Por: {{ letra['artista'] }}</h2> <div>Fecha: {{ letra['Fecha_envio'] }}</div> <div>Letra: {{ !letra['letra'] }}</div> 

Вот как это работает / выглядит, если я позволю Bottle избежать моей лирики html (обратите внимание, как <br> отображается в виде обычного текста):

View post on imgur.com

И, наконец, это то, как СЕЙЧАС СЛЕДУЕТ смотреть

http://i.stack.imgur.com/6b58J.png

Вам нужно разместить восклицательный знак сразу после открытия {{ для бутылки, чтобы узнать это:

 <div>Letra: {{! letra['letra'] }}</div> 

Предпочтительно, вы хотите полностью опустить пробелы, чтобы быть в безопасности:

 <div>Letra: {{!letra['letra']}}</div>