在閱讀完 Miguel Grinberg 的 Flask Web Development: Developing Web Application with Python 並按照書中的案例進行了一遍實操,對 Miguel Grinberg 的 flasky 以及 Grey Li 的 bluelog 簡單改寫後做了一個自己的 Flask 網站,現對 Flask Web 做一個簡單的個人小結。
簡介
Flask 是一個輕量級的 Python web 框架,其採用 jinjia2 作為模板引擎,採用 Werkzeug 作為 WSGI (Web Server Gateway Interface) 工具箱。它採用 extensions 的模式來豐富其功能,讓使用者可以依照自己的需要選擇——甚至可以自己開發第三方外掛。
從搭建部落格的角度說起
要構建一個個人部落格——也就是比較簡單的個人主頁,我們需要三樣東西:一臺常年執行的伺服器,一個供使用者訪問的地址 URL ,提供內容的 WEB 程式。
前兩樣東西一般通過購買獲得(當然第三樣也可以購買或者使用別人搭建好的開源程式),WEB 程式書寫則是我們現在的目標。我們知道,呈現給使用者(客戶端)的內容是 HTML+CSS+JavaScript 的組合,而 Flask 則是幫助我們在後臺控制使用者訪問的工具。
Flask 作為一個輕量級的 Python WEB 框架,其核心只提供了最簡單的功能,包括:
- 路由 route :通過裝飾器將 URL 與檢視函式繫結;
- 除錯 debug :反饋程式中的錯誤並指出問題的程式碼;
- Web 伺服器閘道器介面 WSGI :一種呼叫約定,用於 Web 伺服器將請求轉發到程式中;
- 模板引擎 jinja2 :對模板進行渲染。
其中,路由、除錯和 WSGI 子系統均由 Werkzeug 提供。
至此,我們已經可以寫出最簡單的 Flask 程式:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return "hello world"
if __name__ == "__main__":
app.run()
但對於一個完整的部落格而言,這樣簡單的功能顯然難以滿足我們的需求,幸好,我們可以藉助於 Flask 豐富的第三方擴充完善網頁的功能。
- Flask-WTF: Web 表單的處理;
- Flask-SQLAlchemy: 資料庫操作與訪問;
- Flask-Mail: 電子郵件支援;
- Flask-Login: 使用者認證管理;
- Flask-Markdown: 為部落格提供 Markdown 相關支援;
- Flask-WhooshAlchemy: 使用 Whoosh 實現 Flask-SQLAlchemy 模型的全文檢索;
- Flask-Sitemap: 用於生成網頁站點圖;
更多有關 Flask 第三方庫的推薦可參考 Awesome Flask:https://github.com/humiaozuzu/awesome-flas....
一些套路
虛擬環境
一般而言,使用 Python 做一些專案時,都會為該專案建立單獨的虛擬環境,以避免包的混亂及版本的衝突,保持全域性 Python 直譯器的乾淨整潔的同時,更加便於使用(在虛擬環境中,不需要管理員許可權)。
建立虛擬環境的 Python 包可以用 virtualenv, pyvenv, pipenv 等,以 virtualenv 為例建立專案所需的環境:
$ mkdir projectname
$ cd projectname
# 建立名為 venv 的虛擬環境(名稱無強制要求)
$ virtualenv venv
# 啟用虛擬環境
$ source venv/bin/activate
# Windows 環境下被啟用
$ venv\Scripts\activate
# 安裝 Flask
(venv) $ pip install flask
# 退出環境
$ deactivate
在 Windows 系統中的命令和類 UNIX 系統中不一致,\ / 之間的區別常讓人頭大, cmder (可以在 Windows 系統中使用常用的 bash 命令)可以幫你解決大部分問題。
執行引數
假定你需要執行的 flask 程式為 manage.py
,在測試環境中的執行命令為:
(venv) $ python manage.py runserver
一些常用的可選引數:
- -h, --help: 顯示幫助資訊並退出。
- -t HOST, --t HOST: 允許訪問的 IP 地址,預設情況下只允許本地主機通過
http://127.0.0.1:5000/
進行訪問;通過新增引數--host 0.0.0.0
,任意計算機可通過本地主機外網 IP 地址的 5000 埠訪問。 - -p PORT, --port PORT: 指定訪問埠,預設為 5000 。
- -d, --no-debug: 不啟用除錯模式。
當然,這些只是在開發和測試過程中所執行的方式。一般而言,會為程式設定 開發、測試、生產
三種執行環境,程式執行中所需要用到的一些變數從環境中讀取。生產環境中的執行命令會在後續說明中單獨介紹。
資料儲存
網頁程式一般分為兩部分,一部分是供執行的程式 ~ 如我們使用 Flask 寫的程式,另一部分是網頁的內容 ~ 如「使用者的資料,文章,圖片等」,一般使用資料庫儲存。
對於 Flask 程式而言,可使用 Git 進行管理 ~ 即購買的伺服器既是「網頁伺服器」又是「Git伺服器」,以便於版本控制及網頁遷移。
對於網頁內容,一般使用資料庫進行儲存(在 Flask 程式中使用 flask-sqlalchemy
來進行操作),使用資料庫進行備份以儲存資料。
如此即可實現網頁的快速遷移,也可較好的對資料進行儲存 ~ 網頁遷移時只需要部署環境即可。
參考資料
- Flask 官方網站, http://flask.pocoo.org/. 2018/09/23.
- MiguelGrinberg, 格林布戈, 安道. Flask Web開發:基於Python的Web應用開發實戰[M]. 人民郵電出版社, 2015.
- Awesome Flask, https://github.com/humiaozuzu/awesome-flas....