Тема: Рецепти для Flask
Я приступив до поглибленого вивчення Flask. Вирішив створити тему конспект, в котрій буду писати різні рецепти котрих немає в Flask Mega Tutorial Мігеля Грінберга. Тема створена щоб краще засвоїти матеріал, а заодно щоб полегшити життя людям, котрі можливо будуть гуглити питання по темі українською мовою.
Проста розмітка тексту в блогах та на форумах написаних на Flask
Я знайшов три способи зробити розмітку тексту в блозі. Можливо є більше, якщо хтось знає діліться.
1)Найпростіший це дозволити виводити html-розмітку зроблену користувачами.
Робиться це дуже просто. В шаблоні сторінки в місці де виводиться текст поста додати параметр safe.
{{ post.body | safe }}
Це дуже поганий спосіб оскільки хтось в коментарях зможе ввести
<script>alert("Пішли всі на хутор");</script>
Ну і ви розумієте що буде кожного разу при відкриванню сторінки. Також хтось з користувачів може використати теги на зразок <blink></bkink>, результат використання котрого в різних браузерах не передбачуваний.
Коротше кажучи використання цього способу оправдовується лише тим, що він не потребує додаткових бібліоте. Цей варіант можливий до використання лише на якихось локальних ресурсах де всі свої.
2)Розмітка з бібліотекою bbcode
from flask import Flask
from flask import render_template
import bbcode
app = Flask(__name__)
@app.route('/<name>/')
def hello_world(name):
bb_user = bbcode.render_html('[b]' + name + '[/b]')
return render_template('index.html',
user=bb_user)
if __name__ == "__main__":
app.run()
Хороший спосіб у мене на тестовому сервері-Flask все було круто. Але коли я задеплоїв додаток на Heroku воно незахотіло працювати і постійно крашилося. Навіть не знаю в чому вина, в якихось механізмах Heroku чи криворукості виконавця.
Тому я продовжив процес гугління для пошуку бібліотеки котра б помогла мені подружити Heroku, Flask і bbcode.
3) bbcode з бібліотекою postmarkup
Більше про бібліотеку можна дізнатись на сайті розробника і тут
Все дуже просто і зрозуміло:
import postmarkup
markup = postmarkup.PostMarkup().default_tags()
bbcode = "[b]Hello, World![/b]"
print markup.render_to_html(bbcode)
Оскільки в своїй програмі я не збирався додавати можливість редагування старих постів і цитат, вирішив зберігати в базі данних вже готовий html, щоб лишній раз не ганяти парсер. Cпрощено то виглядає так
...
form = PostForm()#форма вводу тексту на основі wtforms котра передається в шаблон
post = Post(body=render_bbcode(form.post.data),
author=current_user,language=language)#Получаєм текст повідомлення, ім'я користувача, і мову
db.session.add(post)#передаєм все в базу даних
db.session.commit()#коміт
...
А в шаблоні треба знову задати параметр safe
{{ post.body | safe }}
Можете не переживати, вкинути злодійський скрипт на ваш сайт не зможуть, postmarkup якось сам знешкоджує HTML теги введені користувачами і повертає його як звичайний текст скоріше всього просто все екранує, хоча я чесно не перевіряв.
Якщо ж треба надати можливість редагувати повідомлення то треба навпаки зберігати повідомлення з тегами bbcode і рендерити його перед передачею в шаблон. Або описувати цю дію в самім шаблоні, що в моїм випадку являється єдиним доступним варіантом, оскільки вивід постів в моїм шаблоні проходить в циклі.
4)Можна написати свій парсер розмітки тексту.
Для роботи знадобиться бібліотека re фантазія, нерви та вільний час.
P.S Всі зауваження і конструктивна критика приймаються.