模塊是一個包含響應文本的文件,其中包含佔用位變量表示的動態部分,其具體值只在請求的上下文中才知道。使用真實值替換變量,再返回最終獲得的響應字符串,這一過程稱爲渲染。爲了渲染模塊,Flask使用一個名爲Jinja2的強大模板引擎。html
形式最簡單的Jinja2模板就是一個包含響應文本的文件。python
<h1>Hello,World!</h1> <h1>Hello,{{name}}!</h1>
一、渲染模板flask
默認狀況下,Flask在程序文件夾中的templates子文件夾中尋找模板。在下一個hello.py版本中,要把前面定義的模板保存在templates文件夾中,並分別命名爲index.html和user.html。bootstrap
#!/usr/bin/env python from flask import Flask,render_template app = 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模塊引擎集成到了程序中。api
二、變量服務器
模板中使用的{{name}}結構表示一個變量,它是一種特殊的佔位符,告訴模板引擎這個位置的值從渲染模板時使用的數據中獲取。架構
Jinja2能識別全部類型的變量,甚至是一些複雜的類型,例如列表、字典和對象。在模板中使用變量的一些實例以下app
<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標籤都刪除 |
三、控制結構url
在模板中使用條件控制語句:
{% 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>
Bootstrap是客戶端架構,所以不會直接涉及服務器。服務器要作的知識提供引用了Bootstrap層疊樣式表(CSS)和Javascript文件的HTML響應,並在HTML/CSS和Javascript代碼中實例化所需組件。這些操做最理想的執行場所就是模板。
#初始化 Flask-bootstrap from 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 python from flask import Flask,render_template app = 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'),500 if __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.js集成到Jinja2模板中。
#初始化Flask-Moment from flask.ext.moment import Moment moment = Moment(app)
#引入moment.js庫 {% block scripts %} {{ super() }} {{ moment.include_moment() }} {% endblock %}
#!/usr/bin/env python from flask import Flask,render_template app = Flask(__name__) from datetime import datetime from flask_moment import Moment moment = Moment(app) @app.route('/') def index(): return render_template('index.html', current_time=datetime.utcnow()) if __name__ == '__main__': app.run()