Flask入门教程实例:搭建一个静态博客
作者:vpsee 发布时间:2022-08-12 10:17:38
现在流行的静态博客/网站生成工具有很多,比如 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
静态化
到目前为止,上面的博客运行良好,但是有个问题,这个博客还不是 “静态” 的,没有生成任何 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


猜你喜欢
- pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同。但目前pymysql支持python3.x而后者不支持
- 像这种不能创建一个.frm 文件的报错好像暗示着操作系统的文件的权限错误或者其它原因,但实际上,这些都不是的,事实上,这个mysql报错已经
- gzip 是什么东东呢?百科跟我们说gzip是GNU zip的缩写,它是一个 GNU 自由软件的文件压缩程序。…gzip 的基础是 DEFL
- 1.问题引入假设一个场景,一张用户表,包含3个字段。id,identity_id,name。现在身份证号identity_id和姓名name
- 人生苦短,我用python。看到这句话的时候,感觉可能确实是很深得人心,不过每每想学学,就又止步,年纪大了,感觉学什么东西都很慢,很难,精神
- 引言:之前博文介绍过了mysql/oracle与ES之间的同步机制。而logstash最初始的日志同步功能还没有介绍。本文就logstash
- 正在看的ORACLE教程是:Oracle常见错误代码的分析与解决。在使用ORACLE的过程过,我们会经常遇到一些ORACLE产生的错误,对于
- vue动态添加表单validateField验证,代码如下所示:<template> <el-f
- 本文主要介绍了Python3.9.0a1安装pygame出错解决全过程,分享给大家,具体如下:解决方法先说一下经验教训:pygame最后终于
- 你通过以下语句,创建了一个数据库视图:create view entities_entity as select id, nam
- PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS),是以加州大学计算机系开发的POSTGRES,4
- 导语:Python如何下载网页上的图片呢?今天小编给大家分享另一个Python应用小程序,就是:用Python控制摄像头录制视频!学会了也可
- Python 异常处理的实例详解与许多面向对象语言一样,Python 具有异常处理,通过使用 try...except 块来实现。Note:
- 弄了半天也没有找到原因,然后又重新到网上下载几个,还是不行,郁闷坏了,最后结合其他编辑器的用法,才知道是配置文件夹中上传文件夹的路径写错了
- 正确使用字体和颜色可以让网页内容更易阅读,下面我们来看看具体的优化措施。留意颜色的对比对于视力不太好的人或者对于不太好的显示设备来说,黑地白
- 2022-09-29shell操作:我在使用中是pycharm与数据库建立连接的一个工具。使用的环境:在此处是用在了虚拟环境中。使用场景:一
- 最近需要将csv文件转成DataFrame并以json的形式展示到前台,故需要用到Dataframe的to_json方法to_json方法默
- Pandas如何将带有字符串元素的列拆分为多个列。使用以下字符串的方法。str.split():用定界符分割str.extract():按正
- 本文介绍了深入理解ES6中let和闭包,分享给大家,具体如下:在开始本文之前我们先来看一段代码for(var i=0;i<10;i++
- 本文实例讲述了php+jQuery实现的 * 导航栏下拉菜单显示效果。分享给大家供大家参考,具体如下:首先看看效果图:1.数据配置文件 db.