(1)主程序html
from flask import Flask,render_template app = Flask(__name__) @app.route('/') def hello_world(): context = { 'username':'derek', 'age':18, 'gf':{ 'name':'xxx', 'height':160 } } return render_template('index.html',**context) #加雙下劃綫,就能夠直接獲取key和value了 if __name__ == '__main__': app.run(debug=True)
(2)index.htmlpython
<h2>模板中渲染數據</h2> <p>{{ username }}</p> <p>{{ age }}</p> <p>{{ gf.name }}</p> <p>{{ gf['height'] }}</p>
經常使用的過濾器flask
default過濾器的使用後端
主程序app
from flask import Flask,render_template app = Flask(__name__) @app.route('/') def hello_world(): context = { 'position':-9, 'signature':None #個性簽名 } return render_template('index.html',**context) if __name__ == '__main__': app.run(debug=True)
index.html函數
<h2>過濾器</h2> <p>{{ position|abs }}</p> <p>個性簽名:{{ signature|default('此人很懶,沒有留下任何說明',boolean=True) }}</p>
也能夠用or的方式oop
<h2>過濾器</h2> <p>{{ position|abs }}</p> {# <p>個性簽名:{{ signature|default('此人很懶,沒有留下任何說明',boolean=True) }}</p>#} <p>個性簽名:{{ signature or '此人很懶,沒有留下任何說明' }}</p>
過濾器本質上就是一個函數,若是在模板中調用這個過濾器,那麼就會將這個變量的值做爲第一個參數傳給過濾器這個函數,url
而後函數的返回值會做爲這個過濾器的返回值。須要使用一個裝飾器:@app.template_filter('args')spa
實例:自定義時間處理過濾器debug
主程序
from flask import Flask,render_template from datetime import datetime app = Flask(__name__) @app.route('/') def hello_world(): context = { 'create_time':datetime(2018,5,25,17,52,10) } return render_template('index.html',**context) @app.template_filter('handle_time') #括號裏面是本身給過濾器起的名字 def handle_time(time): ''' 1.若是時間間隔小與1分鐘之內,就顯示「剛剛」 2.若是是1小時之內,顯示「xx分鐘」 3.若是24h之內,顯示「xx小時前」 4.若是大於24小時小與30天,顯示「xx天前」 5.大於一個月,顯示具體的時間 :param time: :return: ''' if isinstance(time,datetime): now = datetime.now() timestamp = (now-time).total_seconds() #當前時間離建立時間的秒數 if timestamp < 60: #60s之內 return "剛剛" elif timestamp >= 60 and timestamp < 60*60: minutes = timestamp / 60 return "%s分鐘前"%int(minutes) elif timestamp >= 60*60 and timestamp < 60*60*24: hours = timestamp / (60*60) return '%s小時前'%int(hours) elif timestamp >= 60*60*24 and timestamp < 60*60*24*30: days = timestamp / (60*60*24) return '%s天前'%int(days) else: return time.strftime('%Y/%m/%d %H:%M') else: return time if __name__ == '__main__': app.run(debug=True)
index.html
<h2>自定義時間過濾器</h2> {{ create_time|handle_time }}
for中包含如下變量,能夠用來獲取當前的遍歷狀態
if和for簡單用法
from flask import Flask,render_template app = Flask(__name__) app.config.update({ 'DEBUG':True, 'TEMPLATES_AUTO_RELOAD':True }) @app.route('/') def hello_world(): context = { 'age':20, 'users':['tom','jack','alice'], 'person':{ 'name':'derek', 'age':18 } } return render_template('index.html',**context) if __name__ == '__main__': app.run(debug=True)
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {% if age >= 18 %} 歡迎 {% else %} 無權限 {% endif %} <ul> {% for user in users %} <li>{{ user }}</li> {% endfor %} </ul> <table> <thead> <tr> <th>用戶名</th> <th>年齡</th> </tr> </thead> <tbody> <tr> {% for key,value in person.items() %} <td>{{ value }}</td> {% endfor %} </tr> </tbody> </table> </body> </html>
模板的宏跟python中的函數相似,能夠傳遞參數,可是不能有返回值,能夠將一些常常用到的代碼片斷放到宏中,而後把一些
不固定的值抽取出來當成一個變量。
(1)簡單使用實例
{# 定義一個宏,input是宏的名字,裏面三個參數,能夠指定默認參數值,也能夠調用的傳參#} {% macro input(name="",value="",type="text") %} <input name="{{ name }}" value="{{ value }}" type="{{ type }}"> {% endmacro %} <form> <p>用戶名:{{ input('username') }}</p> <p>密碼:{{ input('password',type="password" )}}</p> <p> {{ input(value="提交",type="submit" )}}</p> </form>
(2)宏的兩種導入方式
新建macros.html
{% macro input(name="",value="",type="text") %} <input name="{{ name }}" value="{{ value }}" type="{{ type }}"> {% endmacro %}
index.html中導入使用宏
{#第一種#} {# with context能夠把後端傳到當前模板的變量傳到定義的宏裏面#} {% import "macros.html" as macro with context %} {#第二種#} {% from "macros.html" import input as input_field %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {# 第一種#} <form> <p>用戶名:{{ macro.input('username') }}</p> <p>密碼:{{ macro.input('password',type="password" )}}</p> <p> {{ macro.input(value="提交",type="submit" )}}</p> </form> {# 第二種#} <form> <p>用戶名:{{ input_field('username') }}</p> <p>密碼:{{ input_field('password',type="password" )}}</p> <p> {{ input_field(value="提交",type="submit" )}}</p> </form> </body> </html>
(1)set
在模板中可使用set來定義變量,一旦定義了這個變量,在後面的代碼中均可以使用,index.html
{% set usernmae='derek' %} <p>用戶名:{{ usernmae }}</p>
(2)with
with語句定義的變量,只能在with語句代碼塊(endwith)裏面使用,超過代碼塊,就不能再使用了,set語句沒有end,全局使用
{% with age=18 %} <p>年齡:{{ age }}</p> {% endwith %}
目錄以下:
(1)news.py
from flask import Blueprint news_bp = Blueprint('new',__name__,url_prefix='/news') @news_bp.route('/list/') def news_list(): return '新聞列表'
(2)user.py
from flask import Blueprint # 1.定義一個藍圖,'user':藍圖的名字,url_prefix='/user':給url加一個前綴,注意後面不要加'/' user_bp = Blueprint('user',__name__,url_prefix='/user') @user_bp.route('/profile/') def profile(): return '我的中心'
(3)bluepoint_demo.py
from flask import Flask,url_for # 2.導入 from blueprints.user import user_bp from blueprints.news import news_bp app = Flask(__name__) # 3.註冊藍圖 app.register_blueprint(user_bp) app.register_blueprint(news_bp) @app.route('/') def hello_world(): return 'Hello World!' with app.test_request_context(): print(url_for('new.news_list')) # /news/list/ 經過url_for反轉url的時候要加藍圖的名字 print(url_for('user.profile')) # /user/profile/ if __name__ == '__main__': app.run(debug=True)