用flask开发个人博客(38)—— 使用MarkDown实现博客文章存储成富文本格式

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lzhui1987/article/details/54426242

一、MarkDown语法

        Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式。Github中项目的MD文件就是用MarkDown语法进行编写,它内嵌支持Html,可以使用Html的大部分标签。我们使用构建博客表单body字段的PageDownFiled生成的是MarkDown格式的文本,在上一文中我们通过Flask-PageDown实际上是将MarkDown格式的文本转换成了Html格式。下面我们通过实例,来验证PageDownFiled对MarkDown语法的支持:
      ‘#’在MarkDown语法中等价于html中的<h1>标签,我们分别在博客的body中使用上面两个标签,看下预览的效果:

        使用<h1>和‘#’都默认生成了一级标题格式的字符串。

二、使用MarkDown模块将Markdown文本装换成html富文本

        我们使用MarkDown模块中的markdown函数,将博客中的MarkDown格式的文本转换成html文本,这一功能我们在Post模型中实现。
from markdown import markdown
import bleach
class Post(db.Model):
    __tablename__='posts'
    id=db.Column(db.Integer,primary_key=True)
    body=db.Column(db.Text)
    timestamp=db.Column(db.DateTime,index=True,default=datetime.utcnow)
    html_body=db.Column(db.Text)

    @staticmethod
    def on_body_change(target,value,oldvalue,initiator):
        allowed_tags=['a','ul','strong','p','h1','h2','h3']
        html_body=markdown(value,output_format='html')
        html_body=bleach.clean(html_body,tags=allowed_tags,strip=True)
        html_body=bleach.linkify(htnl_body)
        target.html_body=html_body

db.event.listen(Post.body,'set',Post.on_body_change)
        我们在Post的模型中增加了一个html_body的字段用来存放,被转换成html格式的文本。并定义了一个静态成员函数on_body_change,在函数中
markdown函数是用来将markdown格式的文本转换成html格式,它接收两个参数,第一个参数是传进来的带转换格式的字符串,第二个参数是输出的格式,这里制定了html。bleach的clean函数负责将多余的html标签进行清除,我们用allowed_tags制定了转换后允许存在的html标签,凡是不再这些指定标签内的其他标签,都会被清除。bleach.linkify的作用是将html文本中的url转换成<a>标签,主要是因为markdown不支持自动将url转换成超链接。

        最后一行代码是调用SQLAlchemy中的监听器db.event.listen,它的第一个参数Post.body指定了监听的对象,第二个参数指定的是监听事件的类型,这里的'set'指明凡是修改Post对象的body字段都会触发该监听器。而其第三个参数就是我们自定义的Post的静态成员函数on_body_change,当监听事件发生,on_body_change作为回调函数被调用。


Github位置:
https://github.com/HymanLiuTS/flaskTs
克隆本项目:
Git clone Git@github.com:HymanLiuTS/flaskTs.Git
获取本文源代码:
Git checkout FL38

展开阅读全文

没有更多推荐了,返回首页