1 模板的創建
模板文件結構:
project/
templates/
模板文件
跳轉模板一般使用:
from flask import render_template,render_template_string
render_template
return render_template('index.html') #將index.html頁面的內容讀取出來並進行響應
render_template_string
return render_template_string('<h1>index</h1>') #可以執行html標簽語句
2 flask模板引擎Jinja2語法:
概述: 模板類似於MVC模式下的view視圖層,模板引擎其實就是用來將模板同業務代碼分離,並解析模板語言的程序.
比如模板代碼
<!doctype html>
<title>Hello template</title>
{% if name %}
<h1>Hello {{ name }}!</h1>
{% else %}
<h1>Hello flask!</h1>
{% endif %}
從上面例子可以發現:
模板表達式是包含在分割符{{ }}內
模板控制語句都是包含在分割符{% %}中
模板注釋都是包含在分隔符{# #}中
-
變量 : 視圖傳遞過來的數據
{{ 變量名稱 }}
-
標簽 : 就是python中的循環\分支結構...
{% 標簽名稱 %}
(1)表達式一般分為以下幾種:
| 表達式種類 | 舉例 |
|---|---|
| 變量(最常用) | {{ name }} |
| 基礎類型( 字符串,數值,列表,元祖,字典,布爾值) | 一般配合表達式使用{{ 'string' }} |
| 運算表達式(算術與邏輯) | {{ False and True }} {{ 2 + 3 }} |
| 過濾器' | ' ,測試器' is ' | 一般配合表達式 |
| 函數調用 | {{ func( ) }} |
| “in”操作符 | {{ 1 in [1,2,3] }} |
| 字符串連接符”~” | {{ ~'like'~ }} |
(2)控制語句一般有:
<dl>
{% for user in users if not user.hidden %}
{% if loop.first %} # 第一次if判定
<div>User List:</div>
{% endif %}
<div class="{{ loop.cycle('odd', 'even') }}">
<dt>User No {{ loop.index }}:</dt>
<dd>{{ user.name }}</dd>
</div>
{% if loop.last %} #最后一次if判定
<div>Total Users: {{ loop.length }}</div>
{% endif %}
{% else %} #都不滿足執行else
<li>No users found</li>
{% endfor %}
</dl>
if elif else
{% if data.bool %}
{{ data.bool }}為真
{% elif data.none %}
{{ data.none }}為真
{% else %}
以上都為假
{% endif %}
for in 循環
{% for k,v in data.items() %}
<li>{{ foo }}</li>
<li>{{ data.abcd }}</li>
<li>{{ k }}==>{{ v }}</li>
{% endfor %}
和else搭配
{% for in %}
...
{% else %}
...
{% endfor %}
注意 : 當進行迭代的對象不存在時 則執行else
Jinja2的循環內置變量獲取當前迭代狀態:
| 變量 | 描述 |
|---|---|
| loop.index | 獲取當前迭代的索引,從1開始 |
| loop.index0 | 獲取當期迭代的索引 從0開始 |
| loop.first | 是否為第一次迭代,返回True或者False |
| loop.last | 是否為最后一次迭代 返回True或者False |
| loop.length | 迭代的長度 |
| loop.depth | 當前循環在遞歸中的層級(從1開始) |
| loop.depth0 | 當前循環在遞歸中的層級(從0開始) |
(3)忽略,轉義,賦值
{% raw %}#忽略模板語法
<ul>
{% for k,v in items %}
<li>{{ k,v }}</li>
{% endfor %}
</ul>
{% endraw %}
Flask會對”.html”, “.htm”, “.xml”, “.xhtml”這四種類型的模板文件開啟HTML格式自動轉義。這樣也可以防止HTML語法注入.
{% autoescape false %} #將自動轉義關閉
<h1>Hello {{ name }}!</h1>
{% endautoescape %}
{% set items = [1,5] %} #使用set關鍵字給變量賦值
3 模板變量函數
**(1) 請求對象request **: 它本身是一個字典,dict['key'] 或者是dict.get['key']
| 表達式 | 含義 |
|---|---|
| request.method | 獲取請求的方法,post get |
| request.form | 獲取表單數據 |
| request.args | 請求的參數 |
| request.url | 獲取完整的請求url |
| request.base_url | 獲取去掉傳參的url |
| request.host_url | 獲取主機名部分的url |
| request.files | 獲取form表單文件上傳的數據 |
| request.cookies | 獲取cookie信息 |
| request.headers | 獲取請求頭信息 |
(2) 會話對象session:本身也是一個字典
session['user'] = u'張三'
設置session需要設置秘鑰
app.secret_key = '123456' 或者在配置文件 app.config['SECRET_KEY'] = '123456'
(3) url_for()函數:通過視圖找到路由
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
(4) with與set
#set 添加變量
{% set name='張三' %}
#set也可賦值給列表或元組
{% set navigation = [('index.html', 'Index'), ('about.html', 'About')] %}
with語句可以創建內部作用域,主要是起到隔離作用
#在with該作用域下可以使用
{% with num = 42 %}
{{ num }}
{% endwith %}
