Flask入門模板Jinja2語法與函數(四)


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 %}

從上面例子可以發現:

模板表達式是包含在分割符{{ }}內

模板控制語句都是包含在分割符{% %}中

模板注釋都是包含在分隔符{# #}中

  1. 變量 : 視圖傳遞過來的數據

    {{ 變量名稱 }}

  2. 標簽 : 就是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 %}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM