为了让网页支持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过滤器