使用Flask搭建靜態部落格
現在流行的靜態部落格/網站生成工具有很多,比如 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
相關文章
- 使用 Hexo 搭建靜態部落格Hexo
- Hexo + Github 搭建靜態部落格(一)HexoGithub
- 基於Hexo搭建靜態部落格Hexo
- Git+Hexo搭建靜態部落格GitHexo
- 使用vuepress搭建GitHub pages靜態部落格頁面VueGithub
- 使用 Gatsby.js 搭建靜態部落格 7 文章目錄JS
- 在 Linux 上搭建Jekyll靜態部落格Linux
- 使用 Gatsby.js 搭建靜態部落格 4 標籤系統JS
- 基於mkdocs-material搭建個人靜態部落格
- hexo+github搭建靜態部落格之初體驗HexoGithub
- 零基礎用GitHub page搭建靜態部落格Github
- 用Flask搭建一個簡易的部落格Flask
- Hexo結合Stun靜態部落格搭建從入門到入土Hexo
- windos系統下hexo+github搭建簡單靜態個人部落格HexoGithub
- MWeb Pro for Mac 靜態部落格生成軟體WebMac
- Docsify+騰訊雲物件儲存 COS,一鍵搭建雲上靜態部落格物件
- 使用 hexo 搭建個人部落格Hexo
- 使用VuePress快速搭建部落格Vue
- 使用React搭建個人部落格React
- 使用Docker搭建Chirpy部落格Docker
- [Kyana]使用FlowUS+elog+Hexo+GithubAction自動化靜態部落格HexoGithub
- 利用 GitHub Actions 實現自動部署靜態部落格Github
- 使用 Hugo 快速搭建個人部落格Go
- 使用github和hexo搭建部落格GithubHexo
- 使用 github + jekyll 搭建個人部落格Github
- 如何快速給自己構建一個溫馨的”家”——用Jekyll搭建靜態部落格
- 如何快速給自己構建一個溫馨的"家"——用Jekyll搭建靜態部落格
- 1024,快速打造你的文件庫/靜態部落格
- Hikari:一個基於php的靜態部落格系統PHP
- 靜態部落格生成軟體:MWeb Pro 中文啟用版Web
- 使用docker搭建nginx掛載hexo部落格DockerNginxHexo
- 使用hexo+next 搭建部落格Hexo
- 基於github和hexo搭建部落格 本地hexo部落格搭建GithubHexo
- 搭建Hexo部落格相簿Hexo
- Hexo 搭建部落格Hexo
- 如何搭建部落格
- hexo搭建github部落格HexoGithub
- 搭建個人部落格