模板## 配置模板路徑
這個在之前我們已經配置好了,可以參考前面的文章
settings = {# 就像upfile就沒有,你寫了也白扯'template_path': os.path.join(BASE_DIR, "templates"),
}
渲染并返回給客戶端
使用render()方法
class HomeIndexHandler(RequestHandler):def get(self):self.render("home.html")
變量與表達式
語法
- { { var } }
- { { expression } }
實例
class HomeIndexHandler(RequestHandler):def get(self):temp = 100# 直接傳一個變量就行self.render("home.html",num = temp)# self.render("home.html")
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>主頁</title>
</head>
<body><h1>這里是主頁</h1>{ { num } }<br><!-- 這里支持加減 -->{ { num + 1 } }{ { num + 18 } }<!-- 這里需要用模板的注釋才能真正的注釋掉雙大括號 --><!-- 這里一定要注意,這個普通的注釋會被加載到頁面中 -->{# num: { { num } } #}<!-- 模板的注釋才是真正的注釋 -->{# num: { { num + 10 } } #}<!-- 等號的賦值的不好使的,會報錯 -->{# num: { { num = 5} } #}
</body>
</html>
流程控制
if
格式
單個的if
{ % if表達式 % }
語句
{ % end % }
if和else的
{ % if表達式 % }
語句1
{ % else % }
語句2
{ % end % }
多個if 的
{ % if表達式1 % }
語句1
{ % elif 表達式2% }
語句2
{ % elif 表達式3% }
語句3
<!--這里面else可有可無-->
{ % end % }
實例
{ % if flag == 0% }
flag確實是0
{ % elif flag == 0 %
語句2
{ % elif flag == 2 % }
flag bug
{ % else % }
baiche
{ % end % }
for
這里面需要注意的是,結束模板語法都是{ % end % }
{ % for 變量 in 集合 % }
語句
{ % end % }
實例:
<ul>{ % for stu in stus % }<li>{ { stu } }</li>{ % end % }
</ul>
while
這個while很少使用,就不寫了
函數
static_url()
作用
- 獲取配置中的靜態目錄的路徑
- 將參數拼接到靜態目錄后面并返回新的路徑
示例
<link rel="stylesheet" href="{ { static_url('css/home.css') } }">
優點
- 修改目錄的話 只需要修改配置文件中的內容即可,不需要修改各種頁面中的URL
- Hash值
- static_url創建了基于文件內容的Hash值
- 將其添加到文件的末尾(當一個查詢參數)
- 這個hash值總能夠保證,我們每一次加載最新的版本
- 而不是之前的緩存的版本
- 不論是開發階段還是線上階段,都是很有必要的
轉義
tornado默認開啟自動轉義功能,能夠防止網站攻擊
class TranHandler(RequestHandler):def get(self):str = "<h1>能不能轉義就看這會的了</h1>"self.render("trans.html",str = str)
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>轉義</title>
</head>
<body>
{ {str} }
</body>
</html>
頁面這樣顯示
<h1>能不能轉義就看這會的了</h1>
關閉自動轉義
- raw:
{ % raw str % }
這個會關閉一行 - 在頁面模板中修改
- autoescape:
{ % autoescape None % }
- 這個不管你三七二十一都關閉了就
- autoescape:
- 在配置文件中修改
autoescape : None
- 當為None時關閉當前項目的自動轉義
- escape()函數
- 這個函數能夠在全局轉義的條件下再不轉義
{ { escape(str) } }
繼承
靜態文件
-
static_path
- 作用
- 告訴tornado從文件系統中某一個特定的位置提供我們的靜態文件
- 示例:
'static_path': os.path.join(BASE_DIR, "static"),
- 請求方式:
http://127.0.0.1:8080/static/html/index.html
- 引用其他文件:
<link rel="stylesheet" href="{ {static_url('css/index.css')} }"> <script src="{ {static_url('js/jquery.js')} }"></script>
- 作用
-
StaticFileHandler
-
使用原因:這種請求方式:
http://127.0.0.1:8080/static/html/index.html
對于用戶來說,體驗不佳 -
本質: 是tornado預制的用來提供靜態資源文件的Handler
-
作用: 可以通過StaticFileHandler來映射靜態資源文件
-
使用:
- 第一種寫法
(r"/(.*)$", tornado.web.StaticFileHandler,{"path":os.path.join(BASE_DIR,"static/html"),}),
- 第二種:
(r"/(.*)$",tornado.web.StaticFileHandler,{"path": os.path.join(BASE_DIR, "static/html"),"default_filename": "index.html"} ),
-
參數:
- path:用來指定訪問提供靜態文件根路徑
- default_filename:用來指定訪問路由中未指定文件名時,訪問哪個靜態中的文件
-
注意:
- 最好在其他路由的最下面寫
- 否則可能會不匹配
- 其中的路由可以去參考一下百度的
-
數據庫
概述
tornado目前沒有自己的數據庫,需要連接數據庫,還得自己去適配
目前python3.6+tornado還沒有完善的驅動
磁盤數據庫和內存數據庫:
比如你以前你的爸爸,那個手機啊,欠費了好幾十還不給你停機
因為數據還沒來得及處理,那個話費單,得一條一條處理,他處理不過來,知道么,當你欠費的時候,他還不知道你欠費呢
現在就不一樣了,你的話單數據都在內存里面了,你一旦欠費,馬上就給你停機,O(∩_∩)O哈哈~
redis的開源的內存數據庫,移動聯通都不用這種數據庫
內存數據庫是國內06年開始有人在搞
從13年開始,又出現了一個分布式內存數據庫,現在人們都有錢了,數據量大了,一臺服務器都存不下了
14年開始,又升級了一下,這次升級的是硬件,以前用的是萬兆網卡,現在更NB了
鏈接
在應用啟動時,創建一個數據庫鏈接實例,供各個requestHandler使用
在requestHandler中,通過self.application來獲取對象