為了讓網頁支持markdown編輯文本,使用如下了4個庫
- PageDown : 在前端提供一個可以實時將markdown內容轉換成html文本進行效果預覽的編輯器
- Flask-PageDown: 這個庫將PageDown集成到Flask-Wtf庫中,更方便使用
- MarkDown: 將MarkDown標記文本轉換為Html文本
- Bleach: 基於白名單清除Html文本中不安全的標簽
PageDown的使用
和其他類庫相識,需要初始化
from flask.ext.pagedown import PageDown pageDown = PageDown(app)
因為PageDown是在前端你用js提供的編輯器,所以與moment庫類似需要在模版文件中包含他,如下:
{{ pagedown.include_pagedown() }}
flask-PageDown 將PageDown庫集成到了Flask-Wtf中,所以可以直接將他當作wtforms的一個字段來使用,並且wtf.quick_form()也能很好的處理他的顯示
from flsk.ext.pagedown.fields import PageDownField class PostForm(Form): body = PageDownField(u"微博內容", validators=[validators.DataRequired()]) submit = SubmitField(u'提交')
MarkDown的使用
MarkDown可以將MarkDown標記文本轉換成Html文本存放到數據庫中,使用很簡單,如下:
from markdown import markdown html_text = markdown(markDown_text, output_format = 'html') #第一個參數是markdown原文本, 第二個參數傳入轉換的類型
Bleach的使用
bleach是一個基於白名單的html過濾器,用他將不安全的標簽過濾掉,以保證安全 Doc
過濾標簽名
import bleach #允許的標簽 allow_tags = ['a', 'abbr', 'acronym', 'b', 'blockquote', 'code', 'em','i','li', 'ol', 'pre', 'strong', 'ul', 'h1', 'h2', 'h3', 'p'] cleaned_text = bleach.clean(html_text, tags=allow_tags, strip=True )
過濾屬性:
import bleach #允許的標簽 allow_tags = ['a', 'abbr', 'acronym', 'b', 'blockquote', 'code', 'em','i','li', 'ol', 'pre', 'strong', 'ul', 'h1', 'h2', 'h3', 'p'] #允許的屬性 #這樣設置將不會過濾所有標簽的class屬性,和a標簽的href,rel屬性.... attrs = { '*': ['class'], 'a': ['href', 'rel'], 'img': ['src', 'alt'], } cleaned_text = bleach.clean(html_text, tags=allow_tags, strip=True, attrs=attrs )
其他
保存在數據庫時把markdown文本轉換成html后再進行清理,最后將安全的html文本儲存在數據庫中, 由於不安全的標簽已被過濾所以在模版中顯示時可以加上safe過濾器