1. 程式人生 > >Flask中模板及其使用(二)

Flask中模板及其使用(二)

                                                              Flask中模板及其使用(二)
一.Flask模板中的特殊變數和函式
用途:可以在自己的模板中訪問一些Flask預設內建的函式和物件.當然,這些變數在檢視中也可以使用.
1.config
可以從模板中直接訪問Flask當前的config的物件:
{{ config.DEBUG}} 
{{config.SECRET_KEY}}
可以寫成列表形式或者:
{{[config.DEBUG, config.SECRET_KEY]}} --> 結果是列表
或者 {{ config.DEBUG, config.SECRET_KEY}}
2.request


即Flask中代表當前請求的request物件
{{request.url}}  --> http://127.0.0.1:5000/
3.session
即Flask的session物件
{{session.username}} --> qia
4.g變數
在檢視中設定g變數的 name 屬性的值,然後在模板中直接可以取出.
{{g.name}}
5.url_for
    url_for會根據傳入的路由器函式名,返回該路由對應的URL,在模板中始終使用url_for()就可以安全的修改路由繫結的URL,則不必須擔心模板中渲染出錯的連結:
{{url_for('index'}}} --> /qi
    如果我們定義的路由URL是帶有引數的,則可以把它們作為關鍵字引數傳入url_for(),Flask會把他們填充進最終生成的URL中:
{{ url_for('post', post_id=1)}}  -->/post/1
6.get_flashed_messages()

       這個函式會返回之前在flask中通過flask()傳入的訊息的列表,flash函式的作用很簡單,可以把由Python字串表示的訊息加入一個訊息佇列中,再使用get_flashed_message()函式取出它們並消費掉:

{%for message in get_flashed_messages()%}
    {{message}}
{%endfor%}

二.模板程式碼的複用
Flask中模板程式碼的複用有 3 種方式:
巨集: 多個模板具有完全相同的頂部和底部內容。
繼承:多個模板中具有相同的模板程式碼內容,但是內容中部分值不一樣。
包括:(多個)模板中具有完全相同的 html 程式碼塊內容。
1.巨集


對巨集(macro)的理解:
    把它看作 Jinja2 中的一個函式,它會返回一個模板或者 HTML 字串.
    為了避免反覆地編寫同樣的模板程式碼,出現程式碼冗餘,可以把他們寫成函式以進行重用.
    需要在多處重複使用的模板程式碼片段可以寫入單獨的檔案,再包含在所有模板中,以避免重複.
使用:包括 定義 和 呼叫 2 個步驟.
<1>定義巨集
定義語法:{% macro 函式名(引數)%}
               複用程式碼塊
          {% endmacro %}
使用:
{% macro input(name,value='',type='text') %}
    <input type="{{type}}" name="{{name}}"
        value="{{value}}" class="form-control">
{% endmacro %}
<2>呼叫巨集
呼叫語法:{ % import '巨集檔案所在檔名' as 別名}
          {{ 別名.呼叫巨集的函式名(引數)}}
{{ input('name' value='zs')}}
這會輸出
<input type="text" name="name"
    value="zs" class="form-control">

主要用途
把巨集單獨抽取出來,封裝成html檔案,其它模板中匯入使用,檔名可以自定義macro.html
{% macro function(type='text', name='', value='') %}
<input type="{{type}}" name="{{name}}"
value="{{value}}" class="form-control">

{% endmacro %}
在其它模板檔案中先匯入,再呼叫
{% import 'macro.html' as func %}
{% func.function() %}

2.模板繼承
       模板繼承是為了重用模板中的公共內容。一般Web開發中,繼承主要使用在網站的頂部選單、底部。這些內容可以定義在父模板中,子模板直接繼承,而不需要重複書寫。
標籤定義的內容
{% block top %} {% endblock %}
相當於在父模板中挖個坑,當子模板繼承父模板時,可以進行填充。
子模板使用 extends 指令宣告這個模板繼承自哪個模板
父模板中定義的塊在子模板中被重新定義,在子模板中呼叫父模板的內容可以使用super()

父模板
base.html
{% block top %}
  頂部選單
{% endblock top %}

{% block content %}
{% endblock content %}

{% block bottom %}
  底部
{% endblock bottom %}

子模板
extends指令宣告這個模板繼承自哪
{% extends 'base.html' %}
{% block content %}
 需要填充的內容
{% endblock content %}

模板繼承使用時注意點
<1>不支援多繼承
<2>為了便於閱讀,在子模板中使用extends時,儘量寫在模板的第一行。
<3>不能在一個模板檔案中定義多個相同名字的block標籤。
<4>當在頁面中使用多個block標籤時,建議給結束標籤起個名字,當多個block巢狀時,閱讀性更好。
父模板和子模板的特點和功能
父模板:抽取多個模板頁面中的相同部分,一般包括頂部/中間/底部內容
子模板:繼承父模板,可以完全服用父模板內容,也可以在父模板的基礎上實現自己特有的頁面內容.
<1>如果想要實現自己特有的頁面內容,重寫指定區域塊,自己填充內容;
<2>如果不想要父模板中的部分內容,直接宣告區域塊,內容為空.
<3>如果既要實現自己的特有內容,又想使用父模板的,使用super().
<4>可以使用多繼承,但是不建議使用.

3.包含
       Jinja2模板中,除了巨集和繼承,還支援一種程式碼重用的功能,叫包含(Include)。它的功能是將另一個模板整個載入到當前模板中,並直接渲染。
本質:程式碼完全複用.
include的使用
{% include 'hello.html' %}
包含在使用時,如果包含的模板檔案不存在時,程式會丟擲TemplateNotFound異常,可以加上 ignore missing 關鍵字。如果包含的模板檔案不存在,會忽略這條include語句。

include 的使用加上關鍵字ignore missing
{% include 'hello.html' ignore missing %}

三.控制程式碼塊
        控制程式碼塊主要包含兩個:

- if/else if /else / endif
- for / endfor
1. if語句

Jinja2 語法中的if語句跟 Python 中的 if 語句相似,後面的布林值或返回布林值的表示式將決定程式碼中的哪個流程會被執行:

{%if user.is_logged_in() %}
    <a href='/logout'>Logout</a>
{% else %}
    <a href='/login'>Login</a>
{% endif %}
過濾器可以被用在 if 語句中:

{% if comments | length > 0 %}
    There are {{ comments | length }} comments
{% else %}
    There are no comments
{% endif %}

2. 迴圈
我們可以在 Jinja2 中使用迴圈來迭代任何列表或者生成器函式
{% for post in posts %}
    <div>
        <h1>{{ post.title }}</h1>
        <p>{{ post.text | safe }}</p>
    </div>
{% endfor %}
迴圈和if語句可以組合使用,以模擬 Python 迴圈中的 continue 功能,下面這個迴圈將只會渲染post.text不為None的那些post:
{% for post in posts if post.text %}
    <div>
        <h1>{{ post.title }}</h1>
        <p>{{ post.text | safe }}</p>
    </div>
{% endfor %}
在一個 for 迴圈塊中你可以訪問這些特殊的變數:
變數    描述
loop.index    當前迴圈迭代的次數(從 1 開始)
loop.index0    當前迴圈迭代的次數(從 0 開始)
loop.revindex    到迴圈結束需要迭代的次數(從 1 開始)
loop.revindex0    到迴圈結束需要迭代的次數(從 0 開始)
loop.first    如果是第一次迭代,為 True 。
loop.last    如果是最後一次迭代,為 True 。
loop.length    序列中的專案數。
loop.cycle    在一串序列間期取值的輔助函式。見下面示例程式。
在迴圈內部,你可以使用一個叫做loop的特殊變數來獲得關於for迴圈的一些資訊

比如:要是我們想知道當前被迭代的元素序號,並模擬Python中的enumerate函式做的事情,則可以使用loop變數的index屬性,例如:
{% for post in posts%}
{{loop.index}}, {{post.title}}
{% endfor %}
會輸出這樣的結果
1, Post title
2, Second Post
cycle函式會在每次迴圈的時候,返回其引數中的下一個元素,可以拿上面的例子來說明:
{% for post in posts%}
{{loop.cycle('odd','even')}} {{post.title}}
{% endfor %}
會輸出這樣的結果:
odd Post Title
even Second Post

相關推薦

Flask模板及其使用()

                                                              Flask中模板及其使用(二)一.Flask模板中的特殊變數和函式 用途:可以在自己的模板中訪問一些Flask預設內建的函式和物件.當然,這些變數在檢視

Flask模板及其使用(一)

                                                                  Flask中模板及其使用     所謂模板,其實就是一個包含響應文字的檔案,其中用佔位符(變數)表示動態部分,告訴模板引擎其具體的值需要從使用的

Flask模板語言Jinja2以及render_template

是時候開始寫個前端了,Flask中預設的模板語言是Jinja2 現在我們來一步一步的學習一下 Jinja2 捎帶手把 render_template 中留下的疑問解決一下 首先我們要在後端定義幾個字串,用於傳遞到前端 STUDENT = {'name': 'Ol

flaskjinjia2模板引擎使用詳解1

模板 文本文 安全 檢查 引擎 分解 擴展名 結果 解釋 在之前的文章中我們介紹過flask調用jinja2模板的基本使用,這次我們來說一下jinjia2模板的使用 Jinja2 在其是一個 Python 2.4 庫之前,被設計 為是靈活、快速和安全的。 模板僅僅是文本文件

flaskjinjia2模板使用詳解2

編程語言 Python 接上文註釋的使用 在jinjia2模板中,使用{# #}進行代碼註釋,如下所示 運行後發現,註釋不會被render出來 去掉空行 兩種方法可以去掉jinjia2模板中的空白行,一是設置jinjia2的環境變量,如下app.jinja_env.trim_blocks =

flaskjinjia2模板引擎的使用詳解3

編程語言 Python 接上文模板繼承 Jinji2中的模板繼承是jinjia2比較強大的功能之一。模板繼承可以定義一個父級公共的模板,把同一類的模板框架定義出來共享。這樣做一方面可以提取共享代碼,減少代碼冗余和重復的工作量另一方面,對於後期的維護和管理也非常方便。一個根模板(或叫基模板)主要有三部分

flaskjinjia2模板引擎使用詳解4

編程語言 Python 接上文For循環和其它編程語言一樣,for用來編輯列表中的項。下面以一個例子來說明for在flask的jinjia2模板中的使用。創建一個模板list.html代碼如下:{% %} {% %} {% %} <>{{ }}</>

flaskjinjia2模板引擎使用詳解5

編程語言 Python 接上文宏可以理解為函數,即把一些常用的模板片段做好封裝,以便於重用,減少工作量和維護難度。宏的定義很簡單:{%macro xxx()%}##這裏寫內容{%endmacro%}下面引用官方的一個例子進行說明:{% macro input(name, value=''

Flask模板

包含 其他 多個 nav OS div 文件中 模版 gpo 宏 Jinja2模板支持宏。這裏的宏類似於Python中的函數。 {% macro render_comments %} <li>{{ comment }}</li> {% en

Python框架學習之Flask的Jinja2模板

代碼復用 表單 filter 中繼 IT AD 存在 開啟 技術分享   前面也提到過在Flask中最核心的兩個組件是Werkzeug和Jinja2模板。其中Werkzeug在前一節已經詳細說明了。現在這一節主要是來談談Jinja2模板。 一、為什麽需要引入模板:   在進

PythonFlask基礎入門(

第一部分是過濾器 這是我們的py檔案 #1.匯入Flask擴充套件. from flask import Flask#匯入我們的Flask框架 from flask import render_template#我們的返回值有兩種,如果要返回html,就需要匯入這個模組 #2.建立Fla

Flask_學習筆記_05: Flask的網頁模板

今天來學習一下Flask中網頁模板以及網頁模板引數的使用。 如果你是使用Pycharm pro版的話,建立專案的時候,選擇Flask專案,所有的基礎檔案和資料夾Pycharm會自動幫你創建出來,在網上找了張圖,僅供參考: 選擇專案型別:Flask,這裡注意你的Python版本建立好之後就是下面的樣子:

Flask初識,第四篇 Jinja2 及 render_template 的深度用法 Flask最強攻略 - 第四篇 Flask 模板語言 Jinja2 及 render_template 的深度用法

Flask最強攻略 - 第四篇 Flask 中的模板語言 Jinja2 及 render_template 的深度用法   是時候開始寫個前端了,Flask中預設的模板語言是Jinja2 現在我們來一步一步的學習一下 Jinja2 捎帶手把 render_templat

flask web開發() 渲染模板與控制結構

# -*- coding: cp936 -*- import os import sys import logging.config import flask import socket from flask import Flask,jsonify from flask import request fro

flask web開發() 渲染模板與控制結構 巨集與繼承

渲染模板與控制結構 hello3.py# -*- coding: cp936 -*- import os import sys import logging.config import flask import socket from flask import Flask,jsonify fro

Flask的一些問題的初步彙總

對於初學Flask的朋友們來說,怎麼去建立路由,指定路徑,可能會有一些疑惑。我直接上程式碼了。註釋裡會提到對應的方法,及注意事項。 啟動Flask。在命令視窗輸入專案路徑,找到之後,執行命令 python 檔名.py 列舉如下資料,如果有說明服務執行正常 * Debug mod

Flaskrender_template的使用和模板的繼承

這就是傳說中的MVC:Model-View-Controller,中文名“模型-檢視-控制器”。 Python處理URL的函式就是C:Controller,Controller負責業務邏輯,比如檢查使用者名稱是否存在,取出使用者資訊等等; 包含變數{{

Flask模板JS傳值簡便方式

  後臺傳值: return render_template('statistics/numberofuserlogin/login_number.html', result_json = json.dumps(result))   模板中JS取值: js_object = ev

flask開發個人部落格(8)—— flask模板

        一般而言,檢視函式中存在兩種邏輯,業務邏輯和表現邏輯。業務邏輯諸如我們在登入頁面時輸入使用者名稱和密碼後,點選確定按鈕時,在資料庫驗證該使用者名稱和密碼是否正確. 表現邏輯就是返回正確

第四篇 Flask 模板語言 Jinja2 及 render_template 的深度用法

是時候開始寫個前端了,Flask中預設的模板語言是Jinja2 現在我們來一步一步的學習一下 Jinja2 捎帶手把 render_template 中留下的疑問解決一下 首先我們要在後端定義幾個字串,用於傳遞到前端 STUDENT = {'name': 'Old', 'age': 38, 'ge