標籤:路由 not with current data scripts 連結 usr app
模組是一個包含響應文本的檔案,其中包含佔用位變數表示的動態部分,其具體值只在請求的上下文中才知道。使用真實值替換變數,再返回最終得到的響應字串,這一過程稱為渲染。為了渲染模組,Flask使用一個名為Jinja2的強大模板引擎。
一、Jinja2模板引擎
形式最簡單的Jinja2模板就是一個包含響應文本的檔案。
<h1>Hello,World!</h1><h1>Hello,{{name}}!</h1>
1、渲染模板
預設情況下,Flask在程式檔案夾中的templates子檔案夾中尋找模板。在下一個hello.py版本中,要把前面定義的模板儲存在templates檔案夾中,並分別命名為index.html和user.html。
#!/usr/bin/env pythonfrom flask import Flask,render_templateapp = Flask(__name__)@app.route(‘/‘)def index(): return render_template(‘index.html‘)@app.route(‘/user/<name>‘)def user(name): return render_template(‘user.html‘,name=name)if __name__ == ‘__main__‘: app.run()
Flask提供的render_template函數把Jinja模組引擎整合到了程式中。
2、變數
模板中使用的{{name}}結構表示一個變數,它是一種特殊的預留位置,告訴模板引擎這個位置的值從渲染模板時使用的資料中擷取。
Jinja2能識別所有類型的變數,甚至是一些複雜的類型,例如列表、字典和對象。在模板中使用變數的一些執行個體如下
<p>a value from a dictionary: {{ mydict[‘key‘] }}</p><p>a value from a list:{{ mylist[3] }}</p><p>a value from a list,with a varliable index:{{ mylist[myintavr] }}</p><p>a value from a objects method:{{ myobj.somemethod() }}</p>
Jinja2變數過濾器
| 過濾器名 |
說明 |
| safe |
、渲染時不轉義 |
| capitalize |
把值得首字母轉換成大寫,其他字母轉換成小寫 |
| lower |
把值轉換成小寫形式 |
| upper |
把值轉換成大寫形式 |
| title |
把值中每個單詞的首字母都轉換成大寫 |
| trim |
把值的首位空格去掉 |
| striptags |
渲染之前把值中所有HTML標籤都刪除 |
3、控制結構
在模板中使用條件控制語句:
{% if user %} Hello,{{ user }}!{% else %} Hello,Stranger!{% endif %}
<ul> {% for commet in commets %} <li>{{ commet }}</li> {% end for %}</ul>
Jinja2還支援宏,類似於Python代碼中的函數。例如:
{% macro render_commet(commet) %} <li>{{ commet }}</li>{% endmacro %}<ul> {% for commet in commets %} {{ render_commet(commet) }} {% endfor %}</ul>
為了重複使用宏,我們可以將其儲存在單獨的檔案中,然後在需要使用的模板中匯入:
{% import ‘macros.html‘ as macros %}<ul> {% for commet in commets %} {{ macros.render_commet(commet) }} {% endfor %}</ul>
另一種重複使用代碼的強大方式是模板繼承,它類似於Python代碼中的類繼承。首先建立一個名為base.html的基模板:
<html><head> {% block head %} <title>{% block title %}{% endblock %} - My Application</title> {% endblock %}</head><body> {% block body %} {% endblock %}</body></html>
二、使用Flask-Bootstrap整合Twitter Bootstrp
Bootstrap是用戶端架構,因此不會直接涉及伺服器。伺服器要做的知識提供引用了Bootstrap層疊樣式表(CSS)和Javascript檔案的HTML響應,並在HTML/CSS和Javascript代碼中執行個體化所需組件。這些操作最理想的執行場所就是模板。
#初始化 Flask-bootstrapfrom flask.ext.bootstrap import Bootstrap#...bootstrap = Bootstrap(app)
初始化Flask-Bootstrap之後,就可以在程式中使用一個包含所有Bootstrap檔案的基模板。
{% extends "bootstrap/base.html" %}{% block title %}Flasky{% 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"> <div class="page-header"> <h1>Hello,{{ name }}!</h1> </div></div>{% endblock %}
三、自訂錯誤介面
#自訂錯誤介面#!/usr/bin/env pythonfrom flask import Flask,render_templateapp = Flask(__name__)@app.errorhandler(404)def page_not_found(e): return render_template(‘404.html‘),404@app.errorhandler(500)def internal_server_error(e): return render_template(‘500.html‘),500if __name__ == ‘__main__‘: app.run()
四:連結
Flask提供url_for()輔助函數,它可以使用程式URL映射中儲存的資訊產生URL。
url_for()函數最簡單的用法是以視圖函數名(或者app.add_url_route()定義路由時使用的端點名)作為參數,返回對應的URL。
使用url_for()產生動態地址時,將動態部分作為關鍵字參數傳入。例如,url_for(‘user‘,name=‘john‘,_external=True)
五、靜態檔案
預設設定下,Flask在程式根目錄中名為static的子目錄中尋找靜態檔案。如果需要,可在static檔案夾中使用子檔案夾存放檔案。
#定義收藏夾表徵圖{% block head %}{{ super() }}<link rel="shortcut icon" href="{{ url_for(‘static‘,filename=‘favicon.ico‘) }}" type="image/x-icon"><link rel="icon" href="{{ url_for(‘static‘,filename=‘favicon.ico‘) }}" type="image/x-icon">{% endblock %}
六、使用Flask-Moment本地化日期和時間
Flask-Moment是一個Flask程式擴充,能把moment.js整合到Jinja2模板中。
#初始化Flask-Momentfrom flask.ext.moment import Momentmoment = Moment(app)
#引入moment.js庫{% block scripts %}{{ super() }}{{ moment.include_moment() }}{% endblock %}
#!/usr/bin/env pythonfrom flask import Flask,render_templateapp = Flask(__name__)from datetime import datetimefrom flask_moment import Momentmoment = Moment(app)@app.route(‘/‘)def index(): return render_template(‘index.html‘, current_time=datetime.utcnow())if __name__ == ‘__main__‘: app.run()
Python Flask模組