摘要:例子如下語法一般在父模板中只能定義一些共性公用的代碼,子模板可能要根據(jù)不同的需求實現(xiàn)不同的代碼。這時候父模板就應(yīng)該提供一個接口,讓子模板來實現(xiàn)。
flask之二 預(yù)熱
在渲染模板的時候,默認會從項目根路徑下的templates目錄下查找模板
如果想要指定模板路徑的時候,就在初始化APP的時候,這樣操作即可:
app = Flask(__name__,template_folder="C:/templates") #template_folder可以指定模板位置模板傳參
在使用render_template渲染模板的時候,可以傳遞關(guān)鍵字參數(shù),以后直接在模板中使用就可以了
如果參數(shù)過多的話,那么就可以將所有的參數(shù)放到一個字典中,然后再傳這個參數(shù)的時候使用**將字典打散成關(guān)鍵字參數(shù)。
小例子:
my_template.py
from flask import Flask,render_template app = Flask(__name__) app.debug = True @app.route("/") def hello_world(): context = { "username": "wanghui", "age":19, "children":{ "user":"ccc", "type":"stu", } } return render_template("index.html", **context) # return render_template("index.html",context=context) # return render_template("index.html",username="wanghui",age=19) if __name__ == "__main__": app.run()
templates/index.html
模板中的url_formy blog 這是模板渲染的數(shù)據(jù)
{#{{ username }}
#} {#{{ age }}
#} {{ context.username }} {{ context.age }}{{ username }}
{{ children.user }}
模板中的url_for和視圖函數(shù)中的url_for是類似的,也是傳遞視圖函數(shù)的名字,也可以傳遞參數(shù)。使用的時候,需要在url_for兩邊加上一個{{ url_for("func_name"),ref="/",id="1"}}
templates.py
from flask import Flask,render_template,url_for app = Flask(__name__) app.debug = True @app.route("/") def hello_world(): return render_template("index.html") @app.route("/accounts/login//") def login(id): return render_template("login.html") if __name__ == "__main__": app.run(port=8888)
templates/index.html
my blog 這是從模板中渲染的
templates/login.html
過濾器Login page 這是登錄頁面
{#{{ 用來存放變量 }}#} {#{% 用來執(zhí)行函數(shù)或者邏輯代碼 %}#}
有時候我們需要在模板中對一些變量進行處理,那么就必須要類似于python中的函數(shù)一樣,可以將這個值傳到函數(shù)中,然后做一些操作。在模板中過濾器相當(dāng)于是一個函數(shù),把當(dāng)前的變量傳入到過濾器中,然后過濾器會根據(jù)自己的功能,再返回相應(yīng)的值,之后再將結(jié)果渲染到頁面上。
基本語法:{{ variable |過濾器的名字 }}
guo
abs(value):返回一個數(shù)值的絕對值。 例如:-1|abs。
default(value,default_value,boolean=false):如果當(dāng)前變量沒有值,則會使用參數(shù)中的值來代替。name|default("xiaotuo")——如果name不存在,則會使用xiaotuo來替代。boolean=False默認是在只有這個變量為undefined的時候才會使用default中的值,如果想使用python的形式判斷是否為false,則可以傳遞boolean=true。也可以使用or來替換。
escape(value)或e:轉(zhuǎn)義字符,會將<、>等符號轉(zhuǎn)義成HTML中的符號。例如:content|escape或content|e。
first(value):返回一個序列的第一個元素。names|first。
format(value,arags,*kwargs):格式化字符串。例如以下代碼:
{{ "%s" - "%s"|format("Hello?","Foo!") }} 將輸出:Helloo? - Foo!
last(value):返回一個序列的最后一個元素。示例:names|last。
length(value):返回一個序列或者字典的長度。示例:names|length。
join(value,d=u""):將一個序列用d這個參數(shù)的值拼接成字符串。
safe(value):如果開啟了全局轉(zhuǎn)義,那么safe過濾器會將變量關(guān)掉轉(zhuǎn)義。示例:
content_html|safe。 int(value):將值轉(zhuǎn)換為int類型。 float(value):將值轉(zhuǎn)換為float類型。 lower(value):將字符串轉(zhuǎn)換為小寫。 upper(value):將字符串轉(zhuǎn)換為小寫。 replace(value,old,new): 替換將old替換為new的字符串。 truncate(value,length=255,killwords=False):截取length長度的字符串。 striptags(value):刪除字符串中所有的HTML標(biāo)簽,如果出現(xiàn)多個空格,將替換成一個空格。 trim:截取字符串前面和后面的空白字符。 string(value):將變量轉(zhuǎn)換成字符串。 wordcount(s):計算一個長字符串中單詞的個數(shù)。
default過濾器詳解:
如果某個變量使用方式是{{ value|default("默認值")}},如果value這個key不存在的話就使用過濾器提供的默認值;如果類似于python中判斷一個值是否為False(例如:空字典,空字符串,空列表的話)那么久必須要傳遞另外一個參數(shù){{ value | default("默認值",boolean=True)}};
可以使用or來替換default("默認值",boolean=True)(例如{{ siginature or "此人很懶沒有留下任何說明"}})
例子:
defaulte_falter.py
from flask import Flask,render_template app = Flask(__name__) @app.route("/") def index(): context = { "position":-9, "signature":"", #"signature":"this ismy blog" } return render_template("index.html",**context) if __name__ == "__main__": app.run(debug=True)
templates/index.html
MyBlog {#個性簽名:{{ signature|default("此人很懶沒有留下任何說明!",boolean=True) }}
#}個性簽名:{{ signature or "此人很懶沒有留下任何說明!"}}
esacape:轉(zhuǎn)義過濾器
safe過濾器:可以關(guān)閉一公分字符串的自動轉(zhuǎn)義
escape過濾器:對某個字符串進行轉(zhuǎn)義
autoescape過濾器:可以對其代碼框內(nèi)的代碼塊關(guān)閉自動轉(zhuǎn)義
first:返回序列中的第一個元素
last:返回序列中的最后一個元素
format:格式化輸出
length:長度計算
int:轉(zhuǎn)換成整數(shù)
replase:舊字符串換成新的
truncate:指定長度截取(結(jié)合striptags去除掉html字段之后截取純凈字符串然后按字數(shù)去做預(yù)覽頁填充)
striptags:去除標(biāo)簽中的html字段
worldcount(s):統(tǒng)計一個長字符串中的單詞數(shù)
小例子:
escape.py
from flask import Flask,render_template app = Flask(__name__) @app.route("/") def hello_world(): context = { "position":-9, "signature":"", "persons":["abc","def"], "age":"18", "article":"hello hello xxooo xxooo!!" } return render_template("index.html",**context) if __name__ == "__main__": app.run(debug=True,port=8080)
templates/index.html
自定義模板過濾器MyBlog {#{% autoescape off %}#} {#個性簽名:{{ signature }}
#} {#{% endautoescape %}#}{{ signature|safe }}
{{ persons|first }}
{{ persons[0] }}
{{ persons|last }}
{{ persons[-1] }}
{{ "我的名字是%s"|format("hello word!") }}
{{ "人數(shù)是 %d"|format(persons|length) }}
{% if age|int == 18 %}年齡是18歲
{% else %}年齡不是18歲
{% endif %}{{ article|replace("hello","sssssz") }}
{{ article|truncate(length=5) }}
{{ signature|striptags }}
在python文件中寫好自己的過濾器(本質(zhì)上就是一個函數(shù))
如果要在模板中調(diào)用這個過濾器,那就需要在這個函數(shù)上加一個裝飾器@app.template_filter("過濾器名稱")
自動加載的話就在app下添加
app.config["TEMPLATES_AUTO_RELOAD"] = True
小例子:
define_filter.py
from flask import Flask,render_template app = Flask(__name__) app.config["TEMPLATES_AUTO_RELOAD"] = True @app.route("/") def hello_world(): context={ "article":"anyway hello anyway hello abccc" } return render_template("index.html",**context) @app.template_filter("cut") def cut(value): vaule = value.replace("hello","sbsb") return value if __name__ == "__main__": app.run(debug=True,port=9090)**
templates/index.html
實戰(zhàn)自定義過濾器myblog {{ article|cut }}
時間處理(從現(xiàn)在到發(fā)帖的時間差)
shizhan.py
from flask import Flask,render_template from datetime import datetime app = Flask(__name__) app.config["TEMPLATES_AUTO_RELOAD"] = True @app.route("/") def index(): context={ "article":"aaa bbb ccc", "create_time":datetime(2018,02,23,10,12,11) } return render_template("index.html",**context) @app.template_filter("handle_time") def handle_time(time): """ 1.距離現(xiàn)在的時間多久,如果間隔在一分鐘以內(nèi)就表示剛剛 2.在一小時以內(nèi)就顯示xx分鐘前 3.在24小時以內(nèi)就顯示xx小時前 4. 在一個月之內(nèi)就顯示多少天之前 5. 否則就顯示具體的時間 :param time: :return: """ if isinstance(time,datetime): now = datetime.now() timestamp = (now - time).total_seconds() #獲取間隔秒數(shù) if timestamp < 60: 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") if __name__ == "__main__": app.run(port=9092,debug=True)
templates/index.html
條件判斷 For循環(huán)MyBlog 發(fā)表時間:{{ create_time|handle_time }}
在jinjia2中的for循環(huán),跟python中的for循環(huán)基本是一致的,也是用for in形式;
而且可以便利所有的序列以及迭代器,但是唯一不同的是jinjia2中的for循環(huán)沒有break和continue
小例子:
for_ex.py
from flask import Flask,render_template app = Flask(__name__) @app.route("/") def hello_world(): context = { "users":["user01","user02","user03"], "person":{ "username":"wanghui", "age":21, "country":"china", }, "books":[ { "name":"sk1", "author":"saa", "price":100, }, { "name": "aaaeede1", "author": "se232aa", "price": 103, }, { "name": "AAAew", "author": "VVVeqwea", "price": 190, }, { "name": "skfdfds1", "author": "sdfsfsdfdaa", "price": 30, } ] } return render_template("index.html",**context) if __name__ == "__main__": app.run(debug=True)
templates/index.html
MyBlog
{{ user }}
{% endfor %}用戶名 | 年齡 | 國家 | ||
---|---|---|---|---|
{{ value }} | {% endfor %}
ID | 書名 | 作者 | 價格 | 總數(shù) |
---|---|---|---|---|
{{ loop.index }} | {{ book.name }} | {{ book.author }} | {{ book.price }} | {{ loop.length }} |
{{ y }}*{{ x }}={{ x*y }} | {% endfor %}
模板中的宏跟python中的函數(shù)類似,可以傳遞參數(shù),但是不能有返回值
使用宏的時候,參數(shù)可以是默認值
小例子:
macro.py
from flask import Flask,render_template app = Flask(__name__) app.config["TEMPLATES_AUTO_RELOAD"] = True app.config["DEBUG"] = True @app.route("/") def hello_world(): return render_template("index.html") if __name__ == "__main__": app.run(port=9999)
templates/index.html
Macro {% macro input(name="",value="",type="text") %} {% endmacro %}登陸頁面
用戶名: | {{ input("username") }} |
密碼: | {{ input("password",type="password") }} |
{{ input(value="提交",type="submit") }} |
在真實的開發(fā)中,會將一些常用的宏多帶帶放在一個文件中,在需要使用的時候,再從這個文件中進行導(dǎo)入。
import語句的用法跟python中的import類似,可以直接import...as...,也可以from...import...或者from...import...as...,假設(shè)現(xiàn)在有一個文件,叫做forms.html,里面有兩個宏分別為input和textarea,如下:
注意事項:
a. inport宏文件 as xxx
b. from 宏文件路徑 import 宏的名字 [as xxx]
c. 宏文件的路徑,不要以相對路徑去找,都要以templates作為絕對路徑去找
d. 如果想要在導(dǎo)入宏的時候,就把當(dāng)前末班的一些參數(shù)傳遞給宏所在的模板,那么就應(yīng)該在導(dǎo)入的時候使用
with context
小例子:
macros.py
from flask import Flask,render_template app = Flask(__name__) app.config["TEMPLATES_AUTO_RELOAD"] = True app.config["DEBUG"] = True @app.route("/") def hello_world(): return render_template("index/index.html") if __name__ == "__main__": app.run(port=9999)
templates/macros/macros.html
{% macro input(name="",value="",type="text") %} {% endmacro %}
templates/index/index.html
{#{% from "macros.html" import input as inp %}#} {% import "macros/macros.html" as macros with context %}Macro 登陸頁面
用戶名: | {{ macros.input("username") }} |
密碼: | {{ macros.input("password",type="password") }} |
{{ macros.input(value="提交",type="submit") }} |
這個標(biāo)簽相當(dāng)于是將指定模板中的代碼復(fù)制粘貼到當(dāng)前的位置
include標(biāo)簽,如果要繼續(xù)使用父模板中的變量,直接用就可以了
include的路徑也和import一樣,需要從templates為根,不要以相對路徑去找。
小例子:
include_ex.py
from flask import Flask,render_template app = Flask(__name__) app.config["TEMPLATES_AUTO_RELOAD"] @app.route("/") def hello_world(): return render_template("index.html",username="wanghui") @app.route("/detail/") def detail(): return render_template("course_detail.html") if __name__ == "__main__": app.run(debug=True)
templates/index.html
MyBlog {% include "common/header.html" %}中間的{% include "common/footer.html" %}
templates/course_detail.html
Title {% include "common/header.html" %}文章詳情!{% include "common/footer.html" %}
templates/common/header.html
templates/common/footer.html
set with語句在模板中,可以使用set來定義變量;一旦定義了這個變量。那么在后面的代碼中,都可以使用這個變量。
with語句定義的變量,只能在with的代碼塊中使用。超出with代碼塊,則不能使用
with不一定要跟一個變量,也可以是一個空的with語句,以后要用的話,就在with中使用set定義的變量來使用。
{% set username="wanghui" %}加載靜態(tài)文件用戶名:{{ username }}
{% with %} {% set classroom="2018" %}班級:{{ classroom }}
{% endwith %}別的班級{{ classroom }}
加載靜態(tài)文件使用的是url_for函數(shù),第一個參數(shù)為static,第二個參數(shù)是filename="path"
路徑查找要以static目錄作為根目錄
小例子:
static_ex.py
from flask import Flask,render_template app = Flask(__name__) app.config.update({ "DEBUG":True, "TEMPLATES_AUTO_RELOAD":True, }) @app.route("/") def hello_world(): return render_template("index.html") if __name__ == "__main__": app.run()
static/css/index.css
body{ background: pink; }
static/js/index.js
alert("hello user!")
static/imgs/sas.jpg
圖片
templates/index.html
模板繼承 為什么需要模板繼承?Title
可以將一些公用的代碼多帶帶抽取出來放到一個父模板中,以后子模板直接繼承就給可以使用了。
這樣可以減少重復(fù)性的代碼,并且以后代碼修改起來也很方便
模板繼承的語法使用extends語句來指明繼承的父模板。父模板的路徑也就是相對于templates文件夾下的絕對路徑。例子如下{% extends "base.html" %}
block語法一般在父模板中只能定義一些共性公用的代碼,子模板可能要根據(jù)不同的需求實現(xiàn)不同的代碼。這時候父模板就應(yīng)該提供一個接口,讓子模板來實現(xiàn)。從而實現(xiàn)業(yè)務(wù)的具體功能。
在父模板中
{% block body_block %}我是base下的
{% endblock %}
在子模板中
{% block body_block %}調(diào)用父模板代碼block中的代碼我是index的內(nèi)容
{% endblock %}
默認情況下,字幕版實現(xiàn)了父模板定義的block,那么子模板中block的代碼就會覆蓋掉父模板中的代碼,要想保留父模板中的block的話就是用{{ super() }}來實現(xiàn)
父模板的內(nèi)容:
{% block body_block %}base.html
{% endblock %}
子模板中的內(nèi)容:
{% extends "base.html" %} {% block body_block %} {{ super() }}調(diào)用另外一個block中的代碼我是index的內(nèi)容
{% endblock %}
在另外一個模板中使用其他模板中的代碼,可以使用{{ self.blockname() }}即可
父模板
{% block title %} {% endblock %} {% block body_block %}base.html
{% endblock %}
子模板:
{% extends "base.html" %} {% block title %} MyIndex {% endblock %} {% block body_block %} {{ super() }} {{ self.title() }}其他注意事項我是index的內(nèi)容
{% endblock %}
繼承的代碼必須放在子模板中的第一行{% extends "base.html" %}
子模板中要實現(xiàn)自己的代碼,要放到block中,不然不生效
繼承的例子:inherit_ex.py
from flask import Flask,render_template app = Flask(__name__) app.config.update({ "DEBUG":True, "TEMPLATES_AUTO_RELOAD":True }) @app.route("/") def index(): return render_template("index.html") @app.route("/detail/") def detail(): return render_template("course_detail.html") if __name__ == "__main__": app.run()
templates/base.html
{% block title %} {% endblock %} {% block body_block %}base.html
{% endblock %}
templates/index.html
{% extends "base.html" %} {% block title %} MyIndex {% endblock %} {% block body_block %} {{ super() }} {{ self.title() }}我是index的內(nèi)容
{% endblock %}
templates/course_detail.html
{% extends "base.html" %} {% block body_block %}this is course
{% endblock %}
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/41667.html
摘要:使用導(dǎo)出端口,使用掛載數(shù)據(jù)卷。清理應(yīng)用使用一鍵清理應(yīng)用總結(jié)已經(jīng)實現(xiàn)了容器擴容自動擋更直觀的控制容器啟動順序及依賴。從部署到編排,單字面理解,看起來能夠維護的容器量都增長了。推薦應(yīng)用包括多個服務(wù),推薦部署方式就是。前言 容器化,云原生越演越烈,新概念非常之多。信息爆炸的同時,帶來層層迷霧。我嘗試從擴容出發(fā)理解其脈路,經(jīng)過實踐探索,整理形成一個入門教程,包括下面四篇文章。 容器化實踐之路-從d...
摘要:今天開始實戰(zhàn)虛擬機之二虛擬機的工作模式。總計有個系列實戰(zhàn)虛擬機之一堆溢出處理實戰(zhàn)虛擬機之二虛擬機的工作模式實戰(zhàn)虛擬機之三的新生代實戰(zhàn)虛擬機之四禁用實戰(zhàn)虛擬機之五開啟編譯目前的虛擬機支持和兩種運行模式。 今天開始實戰(zhàn)Java虛擬機之二:虛擬機的工作模式。 總計有5個系列實戰(zhàn)Java虛擬機之一堆溢出處理實戰(zhàn)Java虛擬機之二虛擬機的工作模式實戰(zhàn)Java虛擬機之三G1的新生代GC實戰(zhàn)Jav...
摘要:目前已經(jīng)成為全球最為流行的建站程序,根據(jù)的最新統(tǒng)計,的市場份額過去一年在持續(xù)增長。報告顯示,市場份額過去一年增長了至,這意味著互聯(lián)網(wǎng)上大約五分之二的網(wǎng)站是用創(chuàng)建的。資料顯示,在年初,為所有網(wǎng)站提供了的支持。作為該年度的第三大主要核心版本。WordPress目前已經(jīng)成為全球最為流行的CMS建站程序,根據(jù) W3techs 的最新統(tǒng)計,WordPress 的市場份額過去一年在持續(xù)增長。W3tech...
摘要:數(shù)據(jù)結(jié)構(gòu)之二叉樹本文講解二叉樹的基本操作查找節(jié)點計算樹的高度清空樹遞歸遍歷先序遍歷中序遍歷后序遍歷按層遍歷來看一下樹的結(jié)構(gòu)首先,為了方便后面看到效果,先手動初始化一個有個節(jié)點的二叉樹查找節(jié)點查找節(jié)點遞歸左子樹遞歸右子樹計算樹的深度計算樹的深 數(shù)據(jù)結(jié)構(gòu)之二叉樹 本文講解二叉樹的基本操作: 查找節(jié)點 計算樹的高度 清空樹 遞歸遍歷:先序遍歷、中序遍歷、后序遍歷 按層遍歷 來看一下樹的結(jié)...
閱讀 868·2021-11-25 09:44
閱讀 1086·2021-11-19 09:40
閱讀 7114·2021-09-07 10:23
閱讀 1988·2019-08-28 17:51
閱讀 1117·2019-08-26 10:59
閱讀 1939·2019-08-26 10:25
閱讀 3149·2019-08-23 18:22
閱讀 873·2019-08-23 16:58