現在流行的靜態博客/網站生成工具有很多,比如 Jekyll, Pelican, Middleman, Hyde 等等,StaticGen 列出了目前最流行的一些靜態網站生成工具。
我們的內部工具由 Python/Flask/MongoDB 搭建,現在需要加上文檔功能,寫作格式是 Markdown,不想把文檔放到數據庫里,也不想再弄一套靜態博客工具來管理文檔,于是找到了 Flask-FlatPages 這個好用的 Flask 模塊。熟悉 Flask 的同學花幾分鐘的時間就可以用搭建一個簡單博客,加上 Bootstrap 的幫助,不到一小時內就可以用 Flask-Flatpages 弄個像模像樣的網站出來。
創建開發環境
首先我們需要 pip,在 Mac 上最簡單的安裝辦法是:
$ virtualenv flask
New python executable in flask/bin/python
Installing setuptools, pip...done.
$ flask/bin/pip install flask
$ flask/bin/pip install flask-flatpages
程序
主程序 blog.py 的功能是,導入必要的模塊、配置 Flask-FlatPages 模塊需要的參數、創建 Flask 應用、寫幾個 URL 路由函數,最后運行這個應用:
DEBUG = True
FLATPAGES_AUTO_RELOAD = DEBUG
FLATPAGES_EXTENSION = '.md'
app = Flask(__name__)
app.config.from_object(__name__)
flatpages = FlatPages(app)
@app.route('/')
def index():
pages = (p for p in flatpages if 'date' in p.meta)
return render_template('index.html', pages=pages)
@app.route('/pages/<path:path>/')
def page(path):
page = flatpages.get_or_404(path)
return render_template('page.html', page=page)
if __name__ == '__main__':
app.run(port=8000)
模版
在 Python 中直接生成 HTML 很繁瑣并不好玩(那是上個世紀90年代的 PHP 搞的事情),在現代社會,我們使用模版引擎,Flask 已經自動配置好了 Jinja2 模版,使用方法 render_template() 來渲染模版就可以了。Flask 會默認在 templates 目錄里中尋找模版,我們只需要創建幾個模版文件就可以了,這里我們創建 base.html, index.html 和 page.html.
<body>
<h1><a href="{{ url_for("index") }}">vpsee.com blog</a></h1>
{% block content %}
{% endblock content %}
</body>
</html>
{% block content %}
<h2>List of pages
<ul>
{% for page in pages %}
<li>
<a href="{{ url_for("page", path=page.path) }}">{{ page.title }}</a>
</li>
{% else %}
<li>No post.</li>
{% endfor %}
</ul>
{% endblock content %}
{% block content %}
<h2>{{ page.title }}</h2>
{{ page.html|safe }}
{% endblock content %}
**Hello World**!
$ vi app/pages/test-flatpages.md
title: Test Flask FlatPages
date: 2014-10-15
tags: [python, flask]
Test [Flask-FlatPages](https://pythonhosted.org/Flask-FlatPages/)
運行
基本搞定,運行看看效果吧:

靜態化
到目前為止,上面的博客運行良好,但是有個問題,這個博客還不是 “靜態” 的,沒有生成任何 html 文件,不能直接放到 nginx/apache 這樣的 web 服務器下用。所以我們需要另一個 Flask 模塊 Frozen-Flask 的幫助。
安裝 Frozen-Flask:
$ ls app/
blog.py build pages static templates
新聞熱點
疑難解答
圖片精選