欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Flask入门教程实例:搭建一个静态博客

程序员文章站 2023-11-20 09:32:16
现在流行的静态博客/网站生成工具有很多,比如 jekyll, pelican, middleman, hyde 等等,staticgen 列出了目前最流行的一些静态网站生成...

现在流行的静态博客/网站生成工具有很多,比如 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)
    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.

复制代码 代码如下:

$ vi app/templates/base.html
<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>vpsee.com static blog</title>
</head>

<body>
    <h1><a href="{{ url_for("index") }}">vpsee.com blog</a></h1>
    {% block content %}
    {% endblock content %}
</body>
</html>


代码里 extends “base.html” 的意思是从 base.html 里继承基本的 “骨架”。
复制代码 代码如下:

$ vi app/templates/index.html
{% extends "base.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 %}


复制代码 代码如下:

$ vi app/templates/page.html
{% extends "base.html" %}

{% block content %}
    <h2>{{ page.title }}</h2>
    {{ page.html|safe }}
{% 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]

test [flask-flatpages](https://pythonhosted.org/flask-flatpages/)

运行

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

复制代码 代码如下:

$ flask/bin/python app/blog.py
 * running on http://127.0.0.1:8000/
 * restarting with reloader

Flask入门教程实例:搭建一个静态博客

静态化

到目前为止,上面的博客运行良好,但是有个问题,这个博客还不是 “静态” 的,没有生成任何 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
│   ├── index.html
│   └── pages
│       ├── hello-world
│       │   └── index.html
│       └── test-flatpages
│           └── index.html
├── pages
│   ├── hello-world.md
│   └── test-flatpages.md
├── static
└── templates
    ├── base.html
    ├── index.html
    └── page.html