本文主要整理下幾個Flask擴展:
0.Flask-Bootstrap:集成Twitter開發的一個開源框架Bootstrap。
1.Flask-Script:為Flask程序添加一個命令行解析器
2.Flask-Moment:本地化日期和時間
本篇基于前兩篇博文,需要使用虛擬環境、使用pip安裝flask等。
0.什么是擴展
Flask被設計為可擴展形式,故而沒有提供一些重要的功能,例如數據庫和用戶認證,所以我們可以選擇最適合的程序的包,或者按需求自行開發。
說白了擴展就是一些附加功能,獨立完成某種功能。
1.Flask-Bootstrap
Bootstrap 是 Twitter 開發的一個開源框架,它提供的用戶界面組件可用于創建整潔且具有吸引力的網頁,而且這些網頁還能兼容所有現代 Web 瀏覽器。
Bootstrap是客戶端框架,因此不會直接涉及服務器。
服務器需要做的指示提供引用了 Bootstrap 層疊樣式表(CSS)和 Javascript 文件的 HTML 響應,并在 HTML、CSS 和 JavaScript 代碼中實例化所需組件。這些操作最理想的執行場所就是模板。
0.安裝Flask-Bootstrap擴展
pip install flask-bootstrap
1.創建app.py文件
app.py文件中寫入:
from flask import Flask,render_template
from flask.ext.bootstrap import Bootstrap
app = Flask(__name__)
bootstrap = Bootstrap(app)#注意這個地方
@app.route('/')
def index():
return render_template('index.html')
if __name__ == "__main__":
app.run(debug = True)
解釋下:
0.
from flask.ext.bootstrap import Bootstrap
:專為 Flask 開發的擴展都暴露在 flask.ext 命名空間下,Flask-Bootstrap 輸出了一個 Bootstrap 類。1.
bootstrap = Bootstrap(app)
:Flask 擴展一般都在創建程序實例時初始化,這行代碼是 Flask-Bootstrap 的初始化方法。
2.創建templates文件夾并創建base.html
base.html中寫入:
{% extends "bootstrap/base.html" %}
{% block title %}Flask{% endblock %}
{% block navbar %}
<div class="navbar navbar-inverse" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/">Flasky</a>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a href="/">Home</a></li>
</ul>
</div>
</div>
</div>
{% endblock %}
{% block content %}
<div class="container">
{% block page_content %}{% endblock %}
</div>
{% endblock %}
解釋下:
0.
{% extends "bootstrap/base.html" %}
:base.html模板繼承自bootstrap/base.html
1.其中
title
、navbar
、content
都是bootstrap/base.html
中定義的塊(還有script
等)。navbar是顯示導航欄。其中的代碼比較多,作用是添加Flasky和Home兩個鏈接,理解下即可。2.
page_content
塊是自己加的。3.以后的html頁面直接繼承base.html就可以啦。
3.創建index.html
index.html中寫入:
{% extends "base.html" %}
{% block title %}首頁{% endblock %}
{% block page_content %}
<h1>這里是首頁,Hello World!</h1>
{% endblock %}
解釋下:
0.
{% extends "base.html" %}
:繼承自base.html1.
page_content
塊就是上面的自己定義的塊。
4.運行程序
顯示如下:
2.Flask-Script
Flask的開發Web服務器支持很多啟動設置選項,但只能在腳本中作為參數傳給app.run()
函數。這種方式很不方便,傳遞設置選項的理想方式是使用命令行參數。
Flask-Scrip就是這么一個Flask擴展,為Flask程序添加一個命令行解析器。Flask-Script自帶了一組常用選項,而且還支持自定義命令。
0.安裝Flask-Script擴展
pip install flask-script
1.修改app.py文件
from flask import Flask,render_template
from flask.ext.bootstrap import Bootstrap
from flask.ext.script import Manager
app = Flask(__name__)
manager = Manager(app)#注意這個地方
@app.route('/')
def index():
return render_template('index.html')
if __name__ == "__main__":
manager.run()#注意這個地方
解釋下:
0.
from flask.ext.script import Manager
:Flask-Script輸出了一個名為Manager的類,同樣也是***flask.ext.XXX***
下。1.
manager.run()
代替了app.run()
,啟動后就能解析命令行啦。
2.使用Flask-Script
0.運行app.py
:python app.py
3.Flask-Moment
服務器需要統一時間單位,這和用戶所在的地理位置無關,所以一般使用協調世界時間(Coordinated Universal Time,UTC)。用戶不愿意看到UTC時間,他們更希望看到當地時間,而且采用當地慣用的格式。
要想在服務器上只使用UTC時間,一個優雅的解決方案是,把時間單位發送給Web瀏覽器。轉換成當地時間,然后渲染。Web瀏覽器可以更好的完成這一任務,因為它能獲取用戶電腦中的時區和區域設置。
有一個使用JavaScript開發的優秀客戶端開源代碼,名為moment.js(http://momentjs.com/),它可以在瀏覽器中渲染日期和時間。
0.安裝Flask-Moment擴展
pip install flask-moment
1.修改app.py文件
from flask import Flask,render_template
from flask.ext.bootstrap import Bootstrap
from flask.ext.script import Manager
from flask.ext.moment import Moment
from datetime import datetime
app = Flask(__name__)
manager = Manager(app)
bootstrap = Bootstrap(app)
moment = Moment(app)
@app.route('/')
def index():
return render_template('index.html',current_time=datetime.utcnow())
if __name__ == "__main__":
manager.run()
解釋下:
0.
from flask.ext.moment import Moment
:導入一個Moment類1.
from datetime import datetime
:導入一個datetime類,用于獲取UTC時間2.
moment = Moment(app)
:向模板開放了moment類,可以在模板中使用3.
current_time=datetime.utcnow()
:獲取當前UTC時間,作為參數傳入index.html
2.修改base.html
base.html修改為:
{% extends "bootstrap/base.html" %}
{% block title %}Flask{% endblock %}
{% block navbar %}
<div class="navbar navbar-inverse" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/">Flasky</a>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a href="/">Home</a></li>
</ul>
</div>
</div>
</div>
{% endblock %}
{% block content %}
<div class="container">
{% block page_content %}{% endblock %}
</div>
<!--注意下方block script-->
{% block scripts %}
{{ super() }}
{{ moment.include_moment() }}
{% endblock %}
{% endblock %}
解釋下:
0.除了
moment.js
,Flask-Moment還依賴jquery.js
。但是Bootstrap中已經引入了jquery.js,故只需要引入moment.js
1.
{{ moment.include_moment() }}
:引入moment.js
,請注意上方的{{ super() }}
3.修改index.html
index.html內容修改為如下:
{% extends "base.html" %}
{% block title %}首頁{% endblock %}
{% block page_content %}
<h1>這里是首頁,Hello World!</h1>
<p>{{ moment(current_time).format('LLL') }}</p>
<p>{{ moment(current_time).fromNow(refresh=True) }}</p>
{% endblock %}
解釋下:
0.
{{ moment(current_time).format('LLL') }}
:根據客戶端電腦中的時區和區域設置渲染日期和時間。參數決定了渲染的方式,'L'到'LLL'分別對應不同的復雜度。format()
函數還可以接受自定義的格式說明符。1.
{{ moment(current_time).fromNow(refresh=True) }}
:moment
是app.py
開放的類,current_time
是app.py
傳遞過來的參數,fromNow()
渲染相對時間戳,參數refresh=True
會隨著時間的推移自動刷新顯示時間。
4.一個完整的Demo
這個Demo,包含上方未介紹到的東西:
0.url_for()函數的使用
1.靜態文件的引入:設置網頁的小圖標(如百度網頁的那個小熊掌)
2.自定義404錯誤頁面
0.創建文件夾,包含文件
文件夾結構如下:
--app
--app.py
--templates
--base.html
--index.html
--user.html
--404.html
--static
--favicon.png
--venv
1.app.py
from flask import Flask,render_template
from flask.ext.bootstrap import Bootstrap
from flask.ext.script import Manager
from flask.ext.moment import Moment
from datetime import datetime
app = Flask(__name__)
manager = Manager(app)
bootstrap = Bootstrap(app)
moment = Moment(app)
@app.route('/')
def index():
return render_template('index.html',current_time=datetime.utcnow())
@app.route('/user/<name>')
def user(name):
return render_template('user.html',name=name)
@app.errorhandler(404)
def page_not_found(e):
return render_template('404.html'),404
if __name__ == "__main__":
manager.run()
2.base.html
{% extends "bootstrap/base.html" %}
{% block head %}
{{ super() }}
<link rel="shortcut icon" href="{{ url_for('static',filename = 'favicon.png') }}" type='image/x-icon'/>
<link rel="icon" href="{{ url_for('static',filename = 'favicon.png') }}" type="image/x-icon"/>
{% endblock %}
{% block title %}Flask{% endblock %}
{% block navbar %}
<div class="navbar navbar-inverse" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/">Flasky</a>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a href="/">Home</a></li>
</ul>
</div>
</div>
</div>
{% endblock %}
{% block content %}
<div class="container">
{% block page_content %}{% endblock %}
</div>
{% block scripts %}
{{ super() }}
{{ moment.include_moment() }}
{% endblock %}
{% endblock %}
3.index.html
{% extends "base.html" %}
{% block title %}首頁{% endblock %}
{% block page_content %}
<h1>這里是首頁,Hello World!</h1>
<p>{{ moment(current_time).format('LLL') }}</p>
<p>{{ moment(current_time).fromNow(refresh=True) }}</p>
{% endblock %}
4.user.html
{% extends "base.html" %}
{% block title %}User{% endblock %}
{% block page_content %}
{% if name %}
<h1> Hello {{ name }} </h1>
{% else %}
<h1> Hello Stranger </h1>
{% endif %}
{% endblock %}
5.404.html
{% extends "base.html" %}
{% block title %} 404 {% endblock %}
{% block page_content %}
<h1>404錯誤:頁面沒有找到 </h1>
{% endblock %}