专栏首页Frost's Blog使用Flask搭建个人博客

使用Flask搭建个人博客

我的个人博客从Hexo迁移到自建主机,主要是为了能自由的增减特性,和随时随地的更新博客(然而并没有)。所以考虑用Python的Web框架来写,由于我最开始是从Flask入门的,对它的源码也最了解,所以就选择了Flask。总的来说,一个个人博客网站,主要包含以下几个功能:

  1. 文章的保存和展示
  2. 文章的分类和标签
  3. 文章的评论管理
  4. 对于动态博客来说,还有博客的后台部分

其中第4部分已经有单独的文章来介绍,使用的是前后端分离的方式访问API。而第3部分我暂时打算用第三方的评论系统来管理(毕竟造个轮子也没有别人强大)。至于文章编写,我当然是选用Markdown。

代码结构

使用Flask来写博客,首先要考虑的是项目结构——它不像Django一样,有固定的推荐结构,而是给了用户很大的自由空间来组织项目的代码,总的来说,有两大流派:

  1. 按业务划分,有点类似于Django APP的组织方式,我们会有post, auth, user, comment等部分。
  2. 按模块划分,分成操作数据库的models部分,渲染视图的views部分,处理模板的部分等等。

由于去掉了评论系统以后,博客的功能还是比较简单的,就是文章、分类、标签的管理,所以我使用了第二种组织方式,下面是我的代码结构:

flaskblog
├── __init__.py
├── admin.py
├── api             # API路由
├── app.py          # app对象
├── babel.cfg
├── cli.py          # app命令行
├── config.py       # 配置
├── md              # markdown解析器
├── models.py       # 数据库模型
├── templates       # HTML模板
├── templating.py   # 模板处理函数
├── translations    # 翻译文件
├── utils.py        # 通用函数
└── views.py        # 视图函数

Flask扩展

用Flask来写Web,最重要的是选用恰当合适的扩展。因为扩展质量良莠不齐,加上有些扩展很久不维护了,以往有很多其他文章中推荐的扩展,其实都不需要了(基于Flask 1.0+版本),本着最小使用的原则,下面是我博客中用到的扩展:

  • Flask-Login处理用户登录
  • 操作数据库的ORM和迁移必备组合Flask-SQLAlchemy和Flask-Migrate
  • Flask-Whooshee搜索索引
  • Flask-Moment本地化时间(因为时间统一以UTC时间保存)
  • Flask-Assets处理静态文件
  • Flask-Babel国际化

由于后台部分是只有API的,而博客展示部分又没有表单,所以Flask-WTF,Flask-Bootstrap这些都不需要了,但Flask-Login还是要用来做后端用户态管理;Flask-Scripts的功能已经内置到Flask中了,所以推荐大家都弃用掉这个扩展。Flask-Assets主要用来Minify CSS和JS文件,它会自动在静态文件的URL中加上一个独特的后缀,这样不用更新静态文件后每次清除缓存。

Markdown渲染

在Python的世界中已经有很多Markdown的解析器,但它们要么有时输出不符合预期(mistune),要么自己写起扩展功能来非常痛苦(python-markdown, python-markdown2),所以我一怒之下自己造了个轮子Marko,它默认符合CommonMark规范且自带GFM支持,还内置提供三个常用的扩展:脚注、目录生成、及中英文之间插入空格,欢迎大家提PR实现更多扩展。在博客项目中,我又利用Marko的扩展机制进行了进一步的定制:图片排版功能。使用方法是将多个图片放在一起(不换行),将渲染为多列图片。例:

![](//static.frostming.com/images/image1.jpg) ![](//static.frostming.com/images/image2.jpg)
![](//static.frostming.com/images/image3.jpg) ![](//static.frostming.com/images/image4.jpg)

渲染效果:

博客源码

更多实现细节可以参阅我已公开到Github上的源码

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python 字符串前面的那些特殊字符

    "Incredible things can be done simply if we are committed to making them happen....

    小闫同学啊
  • 用Streamlit构建机器学习应用

    Streamlit是一个开放源码的Python库,它可以轻松地为机器学习建模漂亮的应用程序。你可以很容易地通过pip在你的终端上安装它,然后开始用Python编...

    AiTechYun
  • Python 数据库迁移工具 Alembic

    Alembic 是一款轻量型的数据库迁移工具,它与 SQLAlchemy 一起共同为 Python 提供数据库管理与迁移支持。

    keinYe
  • 聊一聊Python数据结构--栈

    刚开始学写代码的时候,我们都是想到什么就写什么,反正一个代码文件总归也不会太长。但等进一步深入编程之后,就不能没有章法地随便写了,也要讲究一些“套路”。“数据结...

    Crossin先生
  • 火车票买不到?看我用python监控票源

    最近高铁票比较难买,还有什么候补。要不停的刷,才有时候可以捡漏。有时候明明候补了,到快开车告诉你余票不足,候补失败。

    赵云龙龙
  • 好用到哭!你需要立刻学会的20个Python代码段

    Python是一种非BS编程语言。设计简单和易读性是它广受欢迎的两大原因。正如Python的宗旨:美丽胜于丑陋,显式胜于隐式。

    昱良
  • 超好用的自信学习:1行代码查找标签错误,3行代码学习噪声标签

    在大量的数据集中去描述或查找标签错误本身就是挑战性超高的任务,多少英雄豪杰为之头痛不已。

    昱良
  • 开源项目名称背后的故事【Programming】

    有没有想过你最喜欢的开源项目或者编程语言的名字是从哪里来的? 从 a 到 z,让我们来了解科技术语背后的起源。

    Potato
  • 发布Qml宏预处理工具

    在不改变和影响原有语法的前提下提高qml开发效率。有一些qml项目兼顾与Qt4与Qt5版本,由于QML不用编译,但解释在运行时,使预处理指令不能用于直接通过Q...

    Qt君
  • 学网络编程前的计算机知识普及

    可能有朋友会好奇,前两天刚发布了数据结构,现在突然又发布网络编程,那此刻的我到底在学些神马?哈哈,我这学期的目标就是学数据结构和网络编程,至于学的先后,我想你应...

    泰斗贤若如

扫码关注云+社区

领取腾讯云代金券