模闆中的文法規範
變量:變量時一種特殊的占位符 告訴模闆引擎該位置的
值是從渲染模闆時的資料中來擷取的
在視圖中:
@app.route("/temp")
def temp():
return render_template("01_temp.html",uname="user name")
name和age就是要傳遞到xxx.html中的變量
在模闆中:
{{變量名}}
<title>{{unam}}</title>
Python代碼
@app.route("/temp")
def temp():
dic = {"bookName":"鋼鐵是咋煉成的",
"author": "魯迅",
"price": 32.5 ,
"publisher": "北京大學出版社"}
# 字典傳參 模闆中直接用變量名 不需要params.xxx
return render_template("01_temp.html", **dic)
return render_template("01_temp.html", params=dic)
# 第二種傳參方式
bookName = "鋼鐵是咋煉成的"
author = "魯迅"
price = 32.5
publisher = "北京大學出版社"
return render_template("01_temp.html", **locals())
return render_template("01_temp.html", params=locals())
模闆
<div>
<h1><<{{bookName}}>></h1>
<h3>作者:{{author}}</h3>
<h3>價格:{{price}}</h3>
<h3>出版社:{{publisher}}</h3>
</div>
<div>
<h1><<{{params.bookName}}>></h1>
<h3>作者:{{params.author}}</h3>
<h3>價格:{{params.price}}</h3>
<h3>出版社:{{params.publisher}}</h3>
變量可以傳遞任何類型參數 包括示例對象
tup = ("劉德華", "郭富城", "黎明")
list = ["胡歌", "神話", "仙劍"]
class Person(object):
def __init__(self):
self.name = "None"
def say(self):
return "類方法"
per = Person()
return render_template("01_temp.html", params=locals())
過濾器:
什麼是過濾器?
過濾是允許在變量輸出顯示之前改變變量的值
文法:
{{變量|過濾器}}
Jinja2 變量過濾器
capitalize:
首字母大寫 其他小寫
lower:
把值轉換成全小寫
upper:
把值轉換成全大寫
title:
把值中的每個單首字母全大寫
trim:
去掉兩端空格
<h3>原始值:{{params.uname}}</h3>
<h3>capitalize:{{params.uname|capitalize}}</h3>
<h3>upper:{{params.uname|upper}}</h3>
<h3>lower:{{params.uname|lower}}</h3>
<h3>title:{{params.uname|title}}</h3>
控制結構:
if結構:
{% if 條件 %}
要執行的代碼
{% endif %}
if-else:
瞞住條件要執行的代碼
{% else %}
不滿足執行
if-elif-else:
{% elif 條件 %}
if結構:
{% if params.list %}
<h1>{{params.list}}</h1>
{% endif %}
<p>
if-else:
{% if params.uname %}
<h1>params.uname</h1>
{% else %}
<h1><a href="{{url_for('login')}}">登入</a></h1>
{% endif %}
for結構:
{% for 變量 in 元組/字典/清單 %}
周遊内容
{% endfor %}
for循環:
<div style="font-size: 22px;">
{% for str in params.list %}
<p>{{str}}</p>
{% endfor %}
</div>
<ul>
{% for str in params.tup %}
<li>{{str}}</li>
{% endfor %}
</ul>
<div style="color: red;">
{% for key, value in params.dic.items() %}
<h2>{{key}}:{{value}}</h2>
{% endfor %}
宏:
使用{% macro %}标簽 聲明宏
宏:
<p>
<!--聲明-->
{% macro show(str) %}
<li style="background-color: aqua;">{{str}}</li>
{% endmacro %}
</p>
<!--使用宏顯示資料-->
<p>
{% for str in params.list %}
{{show(str)}}
{% endfor %}
</p>
為了友善重複使用 允許将宏放在單獨的模闆檔案宏單獨聲明定義
建立 macro.html
檔案内可以寫很多個宏 類似于函數子產品
使用時導入 macro.html
{% import "macro.html" as macros %}
調用:
{{macro.show()}}
模闆的包含:
在多處重複使用的模闆代碼可以放在單獨的檔案中 可以被其他的模闆所包含(引用)
{% include "xxx.html" %}

靜态檔案:
什麼是靜态檔案?
在Flask中不能與伺服器動态互動的檔案都是靜态檔案
如:css,js,圖檔,音視訊,壓縮檔案。。。。
并且不能使用實體路徑進行查找
靜态檔案處理:
所有的靜态檔案都儲存在 項目檔案中的一個 static 檔案夾中
static檔案内可以建立子檔案夾
在通路靜态檔案時需要通過/static/資源路徑 進行通路
相當于将邏輯路徑的控制權交給實體路徑
後面就可以寫實體路徑進行查找檔案了
靜态檔案反向解析:
url_for("static", filename="<file_path>")
<img src="{{ url_for('static', filename=) }}"
模闆的繼承:
什麼是模闆的繼承?
模闆的繼承類似于類的繼承 如果一個模闆中出現大量模闆的話
那麼就可以使用繼承的方式來簡化開發
繼承的文法:
父模闆中
需要定義哪些内容在子模闆中是可以被重寫的
{% block 塊名 %}
{% endblock %}
block:
應以允許定義在子模闆中被修改的内容
在父模闆中正常顯示 沒有影響
在子模闆中可以被重寫
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>這是父模闆中 頭部</h1>
{% block container %}
<h1>這是父模闆中 住部</h1>
{% endblock %}
<h1>這是父模闆中 地部</h1>
</body>
</html>
子模闆中
使用{% extends "父模闆名稱" %} 來完成繼承
使用{% block 塊名 %} 來重寫父模闆中的同名内容
{% extends "04_parent.html" %}
{% block container %}
{{ super() }}
<h1>子标簽</h1>
{% endblock %}
自定義錯誤頁面
404錯誤處理
@app.errorhandler(404)
def page_not_found(e):
return render_template("404.html"), 404
@app.errorhandler(404)
def Error_404():
return render_template("404.html")
500錯誤處理
@app.errorhandler(500)
def internal_server_error(e):
return render_template("505.html"), 505
@app.errorhandler(505)
def Error_404():
return render_template("505.html")
繼承後可以無是以為的修改網頁内容 想怎麼該怎麼改