IIS flask 使用Flask搭建静态博客 - IIS - 服务器之家

服务器之家

专注于服务器技术!
当前位置:首页 > Web服务器 > IIS

IIS flask 使用Flask搭建静态博客

发布时间:2017-05-08 来源:服务器之家

现在流行的静态博客/网站生成工具有很多,比如 Jekyll, Pelican, Middleman, Hyde 等等,StaticGen列出了目前最流行的一些静态网站生成工具。

我们的内部工具由 Python/Flask/MongoDB 搭建,现在需要加上文档功能,写作格式是 Markdown,不想把文档放到数据库里,也不想再弄一套静态博客工具来管理文档,于是找到了Flask-FlatPages这个好用的 Flask 模块。熟悉 Flask 的同学花几分钟的时间就可以用搭建一个简单博客,加上 Bootstrap 的帮助,不到一小时内就可以用 Flask-Flatpages 弄个像模像样的网站出来。

创建开发环境

首先我们需要 pip,在 Mac 上最简单的安装办法是:

$ sudo easy_install pip
$ sudo easy_install virtualenv

如果你在 Mac 上用 Homebrew 包管理工具的话的话,也可以用 brew 升级 Python 和安装 pip:

$ brew update
$ brew install python

创建一个 blog 目录、生成 Python 独立虚拟环境并在这个环境里安装需要的 Flask, Flask-FlatPages 模块:

$ mkdir blog
$ cd blog
$ 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 目录下我们分别新建几个目录:static 用来存放 css/js 等文件,templates 用来存放 flask 要用的 Jinja2 模版,pages 用来存放我们静态博客(Markdown 格式):

$ mkdir -p app/static app/templates app/pages
程序

主程序 blog.py 的功能是,导入必要的模块、配置 Flask-FlatPages 模块需要的参数、创建 Flask 应用、写几个 URL 路由函数,最后运行这个应用:

$ vi app/blog.py
#!flask/bin/python
from flask import Flask, render_template
from flask_flatpages import FlatPages
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)
@app.route('/pages/<path:path>/')
def page(path):
page = flatpages.get_or_404(path)
if __name__ == '__main__':
app.run(port=8000)
模版 <!doctype html>
<html>
<head>
<meta charset="utf-8">
<title> static blog</title>
</head>
<body>
<h1><a href="http://shuoit/20141016/{{ url_for("index") }}"> blog</a></h1>
{% block content %}
{% endblock content %}
</body>
</html>
{% block content %}
<h2>List of pages
<ul>
{% for page in pages %}
<li>
<a href="http://shuoit/20141016/{{ 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>
{% endblock content %}

Flask-FlatPages 模块会默认从 pages 目录里寻找 .md 结尾的 Markdown 文档,所以我们把静态博客的内容都放在这个目录里:

$ vi app/pages/hello-world.md
title: Hello World
date: 2014-10-14
tags: [general, blog]
**Hello World**!
$ vi app/pages/test-flatpages.md
title: Test Flask FlatPages
date: 2014-10-15
tags: [python, flask]
运行

基本搞定,运行看看效果吧:

$ flask/bin/python app/blog.py
* Restarting with reloader

静态化

到目前为止,上面的博客运行良好,但是有个问题,这个博客还不是 “静态” 的,没有生成任何 html 文件,不能直接放到 nginx/apache 这样的 web 服务器下用。所以我们需要另一个 Flask 模块Frozen-Flask的帮助。

安装 Frozen-Flask:

$ flask/bin/pip install frozen-flask

修改 blog.py,导入 Flask-Frozen 模块,初始化 Freezer,使用 freezer.freeze() 生成静态 HTML:

$ vi app/blog.py
...
from flask_flatpages import FlatPages
from flask_frozen import Freezer
import sys
...
flatpages = FlatPages(app)
freezer = Freezer(app)
...
if __name__ == '__main__':
if len(sys.argv) > 1 and sys.argv[1] == "build":
freezer.freeze()
else:
app.run(port=8000)

运行 blog.py build 后就在 app 目录下生成 build 目录,build 目录里面就是我们要的 HTML 静态文件:

$ flask/bin/python app/blog.py build
$ ls app/
blog.py build pages static templates

更清晰的目录结构如下:

$ tree app
app
├── blog.py
├── build
│ └── pages
│ ├── hello-world
│ └── test-flatpages
├── pages
│ ├── hello-world.md
│ └── test-flatpages.md
├── static
└── templates