前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Flask搭建个人博客

使用Flask搭建个人博客

作者头像
岂不美哉Frost
发布2019-11-29 21:25:28
1.8K0
发布2019-11-29 21:25:28
举报
文章被收录于专栏:Frost's BlogFrost's Blog

我的个人博客从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部分,处理模板的部分等等。

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

代码语言:javascript
复制
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的扩展机制进行了进一步的定制:图片排版功能。使用方法是将多个图片放在一起(不换行),将渲染为多列图片。例:

代码语言:javascript
复制
![](//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上的源码

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-08-11T,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 代码结构
  • Flask扩展
  • Markdown渲染
  • 博客源码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com