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

一、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

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一个简单的 Flask 实现个人博客的代码示例: ```python from flask import Flask, render_template, request, redirect, url_for, session from datetime import datetime import os app = Flask(__name__) app.secret_key = os.urandom(24) # 主页路由 @app.route("/") def index(): if 'username' in session: username = session['username'] return render_template("index.html", username=username) else: return redirect(url_for('login')) # 注册路由 @app.route("/register", methods=['GET', 'POST']) def register(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] confirm = request.form['confirm'] if password == confirm: # 在这里添加保存用户信息的代码 session['username'] = username return redirect(url_for('index')) else: return render_template("register.html", message="Passwords do not match!") else: return render_template("register.html") # 登录路由 @app.route("/login", methods=['GET', 'POST']) def login(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] # 在这里添加从数据库中验证用户信息的代码 if username == "example" and password == "password": session['username'] = username return redirect(url_for('index')) else: return render_template("login.html", message="Invalid login credentials!") else: return render_template("login.html") # 注销路由 @app.route('/logout') def logout(): session.pop('username', None) return redirect(url_for('index')) # 博客发表路由 @app.route('/post', methods=['GET', 'POST']) def post(): if request.method == 'POST': title = request.form['title'] content = request.form['content'] date = datetime.now() # 在这里添加保存博客信息的代码 return redirect(url_for('index')) else: return render_template('post.html') if __name__ == "__main__": app.run(debug=True) ``` 这是一个简单的 Flask 实现个人博客的代码示例,其中包括了主页、注册、登录、注销和博客发表等路由,您可以根据自己的需要进行修改并添加其他功能。需要注意的是,这只是一个示例代码,并不是完整的个人博客系统代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值