视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Flask入门教程实例:搭建一个静态博客
2020-11-27 14:32:07 责编:小采
文档
 现在流行的静态博客/网站生成工具有很多,比如 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//')
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




vpsee.com static blog


vpsee.com blog


{% block content %}
{% endblock content %}



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


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

{% block content %}

List of pages

{% for page in pages %}

  • {{ page.title }}

  • {% else %}
  • No post.

  • {% endfor %}

    {% endblock content %}


    代码如下:


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

    {% block content %}

    {{ page.title }}


    {{ 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

    静态化

    到目前为止,上面的博客运行良好,但是有个问题,这个博客还不是 “静态” 的,没有生成任何 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

    下载本文
    显示全文
    专题