欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

首頁綜合 正文
目錄

柚子快報激活碼778899分享:算法 Flask之模板

柚子快報激活碼778899分享:算法 Flask之模板

http://yzkb.51969.com/

?前言:本博客僅作記錄學習使用,部分圖片出自網(wǎng)絡,如有侵犯您的權益,請聯(lián)系刪除?

目錄

一、模板的基本用法

1.1、創(chuàng)建模板

1.2、模板語法

1.3、渲染模板

二、模板輔助工具

2.1、上下文

2.2、全局對象

2.3、過濾器

2.4、測試器

2.5、模板環(huán)境對象

三、模板組織結(jié)構

3.1、局部模板

3.2、宏

3.3、模板繼承

四、模板進階實踐

4.1、空白控制

4.2、加載靜態(tài)文件

4.3、消息閃現(xiàn)

4.4、自定義錯誤頁面

4.5、JavaScript和CSS中的Jinja2

致謝

一、模板的基本用法

1.1、創(chuàng)建模板

假設我們要編寫一個用戶的電影清單頁面(用戶信息、用戶收藏的電影列表等)。首先創(chuàng)建一些虛擬數(shù)據(jù)用于測試顯示效果:

?user = {

? ? ?'username': 'Grey Li',

? ? ?'bio': 'A boy who loves movies and music',

?}

??

?movies = [

? ? {'name': 'My Neighbor Totoro', 'year': '1988'},

? ? {'name': 'Three Colours trilogy', 'year': '1993'},

? ? {'name': 'John Harrison', 'year': '1994'},

? ? {'name': 'Perfect Blue', 'year': '1997'},

?]

在templates目錄下創(chuàng)建一個watchlist.html作為模板文件,然后使用Jinja2支持的語法在模板中操作這些變量:

?

?

?

? ? ?

? ? ?{{ user.username }}'s Watchlist

?

?

?$larr; Return

?

{{ user.username }}

?{% if user.bio %}

? ? ?{{ user.bio }}

?{% else %}

? ? ?This user has not provided a bio

?{% endif %}

?{# 下面是電影清單(這是注釋) #}

?

{{ user.username }}'s Watchlist ({{ movies|length }}):

?

    ? ? {% for moive in movies %}

    ? ? ? ? ?

  • {{ movie.name }} - {{ moive.year }}
  • ? ? {% endfor %}

    ?

?

?

Jinja2里常見的三種定界符:

(1)語句 比如if判斷、for循環(huán)等: {% ... %}

(2)表達式 比如字符串、變量、函數(shù)調(diào)用等: {{ ... }}

(3)注釋 {# ... #} 另外,在模板中Jinja2 支持用"."獲取變量的屬性,比如user字典中的username鍵值通過"."獲取,即user.username,在效果上等同于user['username']。

1.2、模板語法

Jinja2運行在模板中使用大部分Python對象,比如字符串、列表、字典、元組、整型、浮點型、布爾值等。支持基本的運算符號(+、-、*、/等)、比較符號(==、 !=等)、邏輯符號(and、or、not等)以及in、is、None和布爾值(True、False)。

還提供多種控制結(jié)構來控制模板的輸出,其中for和if是最常用的兩種。語句使用{% ... %}標識,尤其注意,在語句結(jié)束的地方,我們必須添加結(jié)束標簽:

?{% if user.bio %}

? ? ?{{ user.bio }}

?{% else %}

? ? ?This user has not provided a bio.

?{% endif %}

和Python一樣,for語句用來迭代一個序列:

?

    ? ? {% for moive in movies %}

    ? ? ? ? ?

  • {{ movie.name }} - {{ moive.year }}
  • ? ? {% endfor %}

    ?

在for循環(huán)內(nèi),Jinja2提供了多個特殊變量,常用的循環(huán)變量:

變量名說明loop.index當前迭代數(shù)(從1開始計數(shù))loop.index0當前迭代數(shù)(從0開始計數(shù))loop.revindex當前反向迭代數(shù)(從1開始計數(shù))loop.revindex0當前反向迭代數(shù)(從0開始計數(shù))loop.first如果是第一個元素,則為Trueloop.last如果是最后一個元素,則為Trueloop.previtem上一個迭代的條目loop.nextitem下一個迭代的條目loop.length序列包含的元素數(shù)量

1.3、渲染模板

渲染一個模板就是執(zhí)行模板中的代碼,并傳入所有在模板中使用的變量,渲染后的結(jié)果就是我們要返回給客戶端的HTML響應。使用Flask提供的渲染函數(shù)render_template():

?from flask import Flask,render_template

?...

?@app.route('/watchlist')

?def watchlist():

? ? ?return render_template('watchlist.html', user=user, movies=movies)

除了render_template()函數(shù),F(xiàn)lask還提供了一個render_template_string()函數(shù)用來渲染模板字符串。

其他類型的變量通過相同的方式傳入。示例:

?

這是列表my_list的第一個元素:{{ my_list[0] }}

?

這是元組my_tuple的第一個元素:{{ my_tuple[0] }}

?

這是字典my_dict的鍵為name的值:{{ my_dict['name'] }}

?

這是函數(shù)my_func的返回值:{{ my_func() }}

?

這是對象my_object調(diào)用某方法的返回值:{{ my_object.name }}

二、模板輔助工具

為了方便測試,在templates目錄下創(chuàng)建一個根頁面模板index.html:

?from flask import render_template

??

?@app.route('/')

?def index():

? return render_template('index.html')

2.1、上下文

除了渲染時傳入變量,也可以在模板中定義變量,使用set標簽:

?{% set navigation = [('/','Home'),('/about','About')] %}

也可以將一部分模板數(shù)據(jù)定義為變量,使用set和endset標簽聲明開始和結(jié)束:

?{% set navigation %}

? ? ?

  • Home

    ? ? ?

  • About

    ?{% endset %}

    2.1.1、內(nèi)置上下文變量

    Flask在模板上下文中提供了一些內(nèi)置變量,可以在模板中直接使用:

    變量說明config當前的配置對象request當前的請求對象,在已激活的請求環(huán)境下可用session當前的會話對象,在已激活的請求環(huán)境下可用g與請求綁定的全局變量,在已激活的請求環(huán)境下可用

    2.1.2、自定義上下文

    如果多個模板都需要使用同一變量,設置一個模板全局變量以供使用。Flask提供了一個app.context_processor裝飾器,可以用來注冊模板上下文處理函數(shù),完成統(tǒng)一傳入變量操作:

    ?@app.context_processor

    ?def inject_foo():

    ? ? ?foo = 'I am foo.'

    ? ? ?return dict(foo=foo)

    當我們調(diào)用render_template()函數(shù)渲染任意一個模板時,所有使用app.context_processor裝飾器注冊的模板上下文處理函數(shù)都會被執(zhí)行,這些函數(shù)的返回值會被添加到模板中,因此我們可以在模板中直接使用foo變量。

    除了使用app.context_processor裝飾器,也可以直接將其作為方法調(diào)用,傳入模板上下文處理函數(shù):

    ?...

    ?def inject_foo():

    ? foo = 'I am foo.'

    ? return dict(foo=foo)

    ?app.context_processor(inject_foo)

    使用lambda簡化為:

    ?app.context_processor(lambda:dict(foo='I am foo.'))

    2.2、全局對象

    全局對象值在所有模板中都可以直接使用的對象,包括在模板中導入的模板。

    2.2.1、內(nèi)置全局函數(shù)

    Jinja2在模板中默認提供了一些全局函數(shù)(部分):

    函數(shù)說明range([satrt,]stop[,step])和Python中的range()用法相同lipsum(n=5,html=True,min=20,max=100)生成隨機文本,可以在測試時用來填充頁面。默認生成5段HTML文本,每段包含20-100個單詞dict(**items)和Python中的dict()用法相同

    Flask也在模板中內(nèi)置了兩個全局函數(shù):

    函數(shù)說明url_for()用于生成URL的函數(shù)get_flashed_messages()用于獲取flash消息的函數(shù)

    url_for()用來獲取URL,用法和在Python腳本中相同。在實際的代碼中,這個URL使用url_for()生成,傳入index視圖的端點:

    ?← Return

    2.2.2、自定義全局函數(shù)

    使用app.template_global裝飾器直接將函數(shù)注冊為模板全局函數(shù)。(僅用于注冊全局函數(shù))

    ?# 把bar()函數(shù)注冊為模板全局函數(shù)

    ?@app.template_global

    ?def bar():

    ? ? ?return 'I am bar'

    默認使用函數(shù)的原名稱傳入模板,在app.template_global()裝飾器中使用name參數(shù)可以指定一個自定義名稱。

    2.3、過濾器

    過濾器修改和過濾變量值的特殊函數(shù),過濾器和變量用一個豎線(管道符號)隔開,需要參數(shù)的過濾器可以像函數(shù)一樣使用括號傳遞。

    ?{{ name|title }}

    ?# 這會將name變量的值標題化,相當于Python中調(diào)用name.title()。

    ??

    ?{{ movies|length }}

    ?# 獲取moives長度,相當于Python值調(diào)用len(moives)

    另一種方法是將過濾器作用于部分模板數(shù)據(jù),使用filter標簽和endfilter標簽聲明開始和結(jié)束:

    ?{% filter upper %}

    ? This text bacomes uppercase.

    ?{% endfilter %}

    2.3.1、內(nèi)置過濾器(部分)

    過濾器說明escape(s)轉(zhuǎn)義HTML,別名為efirst(seq)返回序列的第一個元素last(seq)返回序列的最后一個元素length(object)返回變量的長度random(seq)返回序列中的隨機元素

    在使用過濾器時,列表中過濾器函數(shù)的第一個參數(shù)表示過濾的變量值(value)或字符串(s),即豎線符號左側(cè)的值,其他的參數(shù)可以通過括號傳入。

    過濾器可以疊加使用:

    ?# 為變量name設置默認值,并將其標題化

    ?

    Hello,{{ name|default('陌生人')|title }}!

    根據(jù)Flask設置,Jinja2會自動對模板中的變量進行轉(zhuǎn)義,因此我們不需要手動使用escape過濾器或調(diào)用excape()函數(shù)對變量進行轉(zhuǎn)義。若想避免轉(zhuǎn)義,將變量作為HTML解析,可以對變量使用safe過濾器或者在渲染前將變量轉(zhuǎn)換為Markup對象:(不要對用戶輸入的內(nèi)容使用safe,容易被攻擊)

    ?# safe過濾器

    ?{{ sanitied_text|safe }}

    ?# 轉(zhuǎn)換為markup對象

    ?from flask import Markup

    ??

    ?@app.route('/hello')

    ?def hello():

    ? ? ?text = Markup('

    Hello,Flask!

    ')

    ? ? ?return render_template('index.html',text=text) # 這時可以在模板中直接使用{{ text }}

    2.3.2、自定義過濾器

    使用app.template_filter()裝飾器可以注冊自定義過濾器:例注冊一個musical過濾器:

    ?from flask import Markup

    ??

    ?@app.template_filter()

    ?def musical(s):

    ? return s + Markup(' ♫')

    與注冊全局函數(shù)一樣,可以在app.template_filter()中使用name關鍵字設置過濾器的名稱,默認使用函數(shù)名稱。用法與其他過濾器相同。

    2.4、測試器

    在Jinja2中,測試器(Test)是一些用來測試變量或表達式,返回布爾值的特殊函數(shù)。

    ?# number測試器用來判斷一個變量或表達式是否為數(shù)字,我們使用is連接變量和測試器:

    ?{% if age is number %}

    ? ? {{ age * 365 }}

    ?{% else %}

    ? ? ?無效的數(shù)字

    ?{% endif %}

    2.4.1、內(nèi)置測試器(部分)

    測試器說明callable(object)判斷對象是否可被調(diào)用defined(value)判斷變量是否已定義undefined(value)判斷變量是否未定義none(value)判斷變量是否Nonenumber(value)判斷變量是否是數(shù)字string(value)判斷變量是否字符串sequence(value)判斷變量是否是序列,比如字符串、列表、元組iterable(value)判斷變量是否可迭代mapping(value)判斷變量是否是匹配對象,比如字典sameas(value,other)判斷變量與 other是否指向相同的內(nèi)存地址

    使用測試器時,is的左側(cè)是測試器函數(shù)的第一個參數(shù)(value),其他參數(shù)可以添加括號傳入,也可以在右側(cè)使用空格連接,以sameas為例:

    ?{% if foo is sameas(bar) %}...

    ?# 等同于

    ?{% if foo is sameas bar %}...

    2.4.2、自定義測試器

    使用app.template_test()裝飾器來注冊一個自定義測試器。例子:

    ?@app.template_test

    ?def baz(n):

    ? ? ?if n == 'baz':

    ? ? ? ? ?return True

    ? ? ?return False

    同樣,可以使用關鍵字name指定名稱,默認為函數(shù)名稱

    2.5、模板環(huán)境對象

    在Jinja2中,渲染行為由jinja2.Environment類控制,所有的配置選項、上下文變量、全局函數(shù)、過濾器和測試器都存儲在Environment實例上。當與Flask結(jié)合后,我們直接使用Flask創(chuàng)建的Environment對象,它存儲在app.jinja_env屬性上(其可以更改Jinja2設置)

    ?#使用variable_start_string和variable_end_string自定義變量定界符的開始和結(jié)束

    ?app = Flask(__name__)

    ?app.jinja_env.variable_start_string = '[['

    ?app.jinja_env.variable_end_string = ']]'

    模板環(huán)境中的全局函數(shù)、過濾器和測試器分別存儲在Environment對象的globals、filters和tests屬性中,都是字典對象。

    2.5.1、添加自定義全局對象

    和app.template_global()裝飾器不同,直接操作globals字典允許我們傳入任意Python對象,而不僅僅是函數(shù),類似上下文處理函數(shù)的作用。

    ?# 添加全局函數(shù)bar和全局變量foo:

    ? def bar():

    ? ? ?return 'I am bar'

    ?foo = 'I am foo'

    ?app.jinja_env.globals['bar'] = bar

    ?app.jinja_env.globals['foo'] = foo

    2.5.2、添加自定義過濾器

    ?# 添加自定義過濾器smiling

    ?def smiling(s):

    ? ? ?return s + ':)'

    ?app.jinja_env.filters['smiling'] = smiling

    2.5.3、添加自定義測試器

    ?# 添加自定義測試器baz

    ?def baz(n):

    ? ? ?if n == 'baz':

    ? ? ? ? ?return True

    ? ? ?return False

    ?app.jinja_env.tests['baz'] = baz

    三、模板組織結(jié)構

    Jinja2還提供了一些工具來在宏觀上組織模板內(nèi)容。更好實踐DRY(Don't Repeat Yourself)原則

    3.1、局部模板

    當多個獨立模板都會使用同一塊HTML代碼時,我們把這部分代碼抽離出來,存儲到局部模板中??梢员苊庵貜陀址奖憬y(tǒng)一管理。

    我們使用include標簽插入一個局部模板,這會把局部模板的全部內(nèi)容插在使用include標簽的位置:

    ?{% include '_banner.html' %}

    為了和普通模板區(qū)分開,局部模板命名通常以一個下劃線開始

    3.2、宏

    宏(macro)是Jinja2中的特性,類似Python中的函數(shù)。使用宏可以將一部分模板代碼封裝到宏里,使用傳遞的參數(shù)來構建內(nèi)容,最后返回構建后的內(nèi)容。

    為了便于管理,通常把宏存儲到單獨文件中(macros.html)。

    使用macro和endmacro標簽聲明宏的開始和結(jié)束,在開始標簽中定義宏的名稱和接收的參數(shù):

    ?{% macro qux(amount=1) %}

    ? ? ?{% if amount ==1 %}

    ? ? ? ? I am qux.

    ? ? ?{% elif amount > 1 %}

    ? ? ? ? We are quxs.

    ? ? ?{% endif %}

    ?{% endmacro %}

    使用時使用import語句導入,然后作為函數(shù)調(diào)用,傳入必要的參數(shù):

    ?{% from 'macros.html' impor qux %}

    ?...

    ?{{ qux(amount=5) }}

    默認情況下包含(include)一個局部模板會傳遞當前上下文到局部模板,但導入(import)不會。換句話:當我們使用render_template()函數(shù)渲染一個foo.html模板時,這個foo.html的模板上下文中包含下列對象:

    Flask使用內(nèi)置的模板上下文處理函數(shù)提供的g、session、config、request。擴展使用內(nèi)置的模板上下文處理函數(shù)提供的變量自定義模板上下文處理器傳入的變量使用render_template()函數(shù)傳入的變量Jinja2和Flask內(nèi)置及自定義全局對象Jinja2內(nèi)置及自定義過濾器Jinja2內(nèi)置及自定義測試器

    使用include標簽插入的局部模板同樣可以使用上述。而導入一個并非被直接渲染的模板,這個模板僅包含下列對象:

    Jinja2和Flask內(nèi)置及自定義全局對象Jinja2內(nèi)置及自定義過濾器Jinja2內(nèi)置及自定義測試器

    因此,若想在導入的宏中使用第一個列表中的2,3,4項,就需要在導入時顯式地使用with context聲明傳入當前模板的上下文:

    ?{% from 'macros.html' impor foo with context %}

    3.3、模板繼承

    Jinja2的模板允許定義一個基模板,把像導航欄、頁腳等通用部分放在基模板中。

    3.3.1、編寫基模板

    基模板存儲程序頁面固定部分,通常被命名為base.html或layout.html。

    ?

    ?

    ?

    ? ? ?

    ? ? ?{% block title %}Template - HelloFlask{% endblock %}

    ? ? {% block styles %}{% endblock %}

    ?

    ?

    ?

    ?

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

    ?

    ?

    ? ? {% block footer %}

    ? ? ? ? ...

    ? ? {% endblock %}

    ?

    ?{% block scripts %}{% endblock %}

    ?

    ?

    當子模板繼承基模板后,會自動包含基模板的內(nèi)容和結(jié)構。在基模板定義塊(block),在子模板中可以通過定義同名的塊來執(zhí)行繼承操作。

    塊的開始和結(jié)束用block和endblock標簽聲明,可以嵌套。為了避免塊的混亂,塊的結(jié)束標簽可以指明塊名,確保前后名稱一致。

    ?{% block body %}

    ?...

    ?{% endblock body %}

    3.3.2、編寫子模板

    在子模板中只需要對特定的塊進行修改。

    ?{% extends 'base.html' %}

    ?{% from 'macro.html' import qux %}

    ??

    ?{% block content %}

    ?{% set name='baz' %}

    ?

    Template

    ?

      ? ? ?

    • Watchlist
    • ? ? ?

    • Filter:{{ foo|musical }}
    • ? ? ?

    • Global:{{ bar() }}
    • ? ? ?

    • Test:{% if name is baz %}I am baz.{% endif %}
    • ? ? ?

    • Macro:{{ qux(amount=5) }}
    • ?

    ?{% endblock %}

    extends標簽聲明擴展基模板,且必須是子模板的第一個標簽。

    我們在基模板中定義了四個塊,在子模板中,我們可以對父模板中的塊執(zhí)行兩種操作:

    (1)覆蓋內(nèi)容

    在子模板創(chuàng)建同名的塊,會使用子塊的內(nèi)容覆蓋父塊的內(nèi)容。

    (2)追加內(nèi)容

    使用Jinja2提供的super()函數(shù)進行聲明,這會向父塊添加內(nèi)容,例如(向基模板中的styles塊追加一行

    ?{% endblock %}

    四、模板進階實踐

    模板在Flask程序中的常見應用(加載靜態(tài)文件和自定義錯誤頁面)

    4.1、空白控制

    在實際輸出的HTML文件中模板中的Jinja2語句、表達式和注釋會保留移除后的空行。

    {% if user.bio %}

    ? ? ?{{ user.bio }}

    ?{% else %}

    ? ? ?This user has not provided a bio.

    ?{% endif %}

    ??

    ?# 實際輸出的HTML代碼:

    ??

    ?{{ user.bio }}

    ??

    ?This user has not provided a bio.

    若想在渲染時自動去掉這些空行,在定界符內(nèi)側(cè)添加減號。{%- endfor %}會移除該語句前的空白,同理,右邊可以移除該語句后面的空白

    {% if user.bio -%}

    ? ? ?{{ user.bio }}

    ?{% else -%}

    ? ? ?This user has not provided a bio.

    ?{%- endif %}

    ??

    ?# 現(xiàn)在輸出的Html:

    ?{{ user.bio }}

    ?This user has not provided a bio.

    除了使用減號,還可以使用模板環(huán)境對象提供的trim_blocks(刪除語句后的第一個空行)和lstrip_blocks屬性(刪除語句所在行之前的空格和制表符)設置。

    ?app.jinja_env.trim_blocks = True

    ?app.jinja_env.lstrip_blocks = True

    ??

    ?# trim_blocks值的block指的是使用{%...%}界定的代碼塊,與繼承的塊無關

    宏內(nèi)的空白制作不受terim_blocks和lstrip_blocks屬性控制,我們需要手動設置:

    ?{% macro qux(amount=1) %}

    ? ? {% if amount ==1 -%}

    ? ? ? ? I am qux.

    ? ? {% elif amount > 1 -%}

    ? ? ? ? We are quxs.

    ? ? {%- endif %}

    ?{% endmacro %}

    事實上,我們沒必要嚴格控制HTML輸出,因為多余的空白并不影響瀏覽器的解析。

    4.2、加載靜態(tài)文件

    在Flask程序中,默認將靜態(tài)文件存儲在與主腳本同級目錄的static文件夾中。

    使用url_for()函數(shù)獲取靜態(tài)文件的URL在HTML模板中引用。Flask內(nèi)置了用于獲取靜態(tài)文件的視圖函數(shù),端點值為static,它的默認URL規(guī)則為/static/path:filename,URL變量filename是相對于static文件夾根目錄的文件路徑。

    提示:若想使用其他文件夾來存儲靜態(tài)文件,可以在實例化Flask類時使用static_folder參數(shù)指定。在實例化Flask類時使用static_url_path參數(shù)則可以自定義靜態(tài)文件的URL路徑。

    ?

    另外,我們還創(chuàng)建了一個存儲CSS規(guī)則的styles.css文件,加載方法:

    ?

    4.2.1、添加Favicon

    前兩章運行的時候,會看到一條404狀態(tài)請求記錄,請求的URL是/favicon.ico

    ?127.0.0.1 - - [08/Feb/2024 18:30:12] "GET /Favicon.ico HTTP/1.1" 404 -

    Favicon.icon文件指的是Favicon(收藏夾頭像/網(wǎng)站頭像),又稱shortcut.icon、tab icon、website.icon或是bookmark.icon。作為網(wǎng)站的特殊標記。

    將Favicon文件放在static目錄下,F(xiàn)lask中靜態(tài)文件的默認路徑是/static/filename,為了正確返回Favicon,我們可以顯式的在HTML頁面中聲明Favicon的路徑。

    ?

    4.2.2、使用CSS框架

    自寫CSS比較麻煩,以Bootstrap為例,訪問官網(wǎng)下下載相應的資源文件,然后分類放到static目錄下。

    ?{% block styles %}

    ? ?

    ?{% endblock %}

    ?...

    ?{% block scripts %}

    ?

    ?

    ?

    ?{% endblock %}

    若是想簡化開發(fā)過程,那么從CDN加載是更方便的做法。從CDN加載時,只需要將相應的URL替換為CDN提供的資源URL,例:

    ?{% block styles %}

    ? ?

    ?{% endblock %}

    4.2.3、使用宏加載靜態(tài)資源

    創(chuàng)建一個專門用于加載靜態(tài)資源的宏,例如:

    ?{% macro static_file(type,filename_or_url,local=True) %}

    ? ? ?{% if local %}

    ? ? ? ? ?{% set filename_or_url = url_for('static',filename_or_url) %}

    ? ? ?{% endif %}

    ? ? ?{% if type == 'css' %}

    ? ? ? ?

    ? ? ?{% elif type == 'js' %}

    ? ? ? ?

    ? ? ?{% elif type == 'icon' %}

    ? ? ? ?

    ? ? ?{% endif %}

    ?{% endmacro %}

    在模板 中導人宏后,只需在調(diào)用時傳入靜態(tài)資源 別和文件路徑就會獲得完整的資源加載語句

    ?# 使用它加載 css 文件的示例

    ?static_file('css','css/bootstrap.min.css')

    ??

    ?# 使用它加載CDN資源

    ?static_file ('css','https://maxcdn.../css/bootstrap.min.css’,local=False)

    4.3、消息閃現(xiàn)

    Flask提供的flash()函數(shù)用來“閃現(xiàn)”需要顯示給用戶的信息,比如當用戶登錄成功后顯示“歡迎回來!”。

    使用功能flash()函數(shù)發(fā)送的消息會存儲在session中(所有我們需要為程序設置密鑰??梢酝ㄟ^app.secret_key屬性或配置變量SECRET_KEY設置),我們需要在模板中使用全局函數(shù)get_flashed_messages()獲取消息并將其顯示出來。

    ?from flask import Flask, render_template, flash, redirect, url_for

    ??

    ?app = Flask(__name__)

    ?app.secret_key = 'secret string'

    ??

    ?@app.route('/flash')

    ?def just_flash():

    ? ? ?flash('I am flash, who is looking for me?')

    ? ? ?return redirect(url_for('index'))

    在Python 2.x版本中,如果字符串包含中文或任何非ASCII字符,需要使用u前綴來聲明這個字符串為Unicode字符串。同時,需要在Python文件的首行添加編碼聲明,通常是# -*- coding: utf-8 -*-,這告訴Python使用UTF-8編碼來解碼字符串。這樣做可以避免發(fā)送中文消息時出現(xiàn)編碼問題。

    ?# -*- coding: UTF-8 -*-

    ?...

    ?@app.route('/flash')

    ?def just_flash():

    ? ? flash(u'你好!')

    ? ? return redirect(url_for('index'))

    使用get_flashed_messages()函數(shù)渲染flash消息:

    ?

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

    ? ? ? ? ?

    {{ message }}

    ? ? {% endfor %}

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

    ?

    當get_flashed_messages()函數(shù)被調(diào)用時,session中存儲的所有消息都會被移除。發(fā)現(xiàn),重載后的頁面不再出現(xiàn)這條消息。

    4.4、自定義錯誤頁面

    首先創(chuàng)建錯誤頁面的模板文件,可在templates里面創(chuàng)建一個errors子文件夾,最常見的有404和500錯誤的模板文件。下面是一個404.html模板示例

    ?{% extends 'base.html' %}

    ??

    ?{% block title %}404 - Page Not Found{% endblock %}

    ??

    ?{% block content %}

    ?

    Page Not Found

    ?

    You are lost...

    ?{% endblock %}

    錯誤處理函數(shù)需要附加app.errorhandler()裝飾器,并傳入錯誤狀態(tài)碼作為參數(shù)。錯誤處理函數(shù)本身則需要接收異常類作為參數(shù),并在返回值中注明對應的HTTP狀態(tài)碼。當發(fā)生錯誤時,對應的錯誤處理函數(shù)會被調(diào)用,它的返回值會作為錯誤響應的主體。

    ?...

    ?@app.errorhandler(404)

    ?def page_not_found(e):

    ? ? ?return render_template('errors/404.html'),404

    Werkzeug內(nèi)置的HTTP異常類的常用屬性

    屬性說明code狀態(tài)碼name原因短語description錯誤描述,另外使用get_description()方法還可以獲取HTML格式的錯誤描述代碼

    4.5、JavaScript和CSS中的Jinja2

    程序變大時,有時我們需要在JavaScript和CSS代碼中使用Jinja2提供的變量值,甚至是控制語句。比如通過傳入模板的theme_color變量來為頁面設置主題色彩,或是根據(jù)用戶是否登錄來決定是否執(zhí)行某個JavaScript函數(shù)

    只有使用remder_template()傳入的模板文件才會被渲染,若把Jinja2代碼寫在單獨的JavaScript或是CSS文件中,盡管在HTML中引用了它們,也不會被執(zhí)行,以下是以下Tips:

    4.5.1、行內(nèi)/嵌入式JavaScript/CSS

    在HTML中使用

    ??

    ?# 在CSS文件中使用var()函數(shù)傳入變量名即可獲取對應的變量值

    ?#foo {

    ? ? color: var(--theme-color);

    ?}

    ?#bar {

    ? ? background: var(--background-url);

    ?}

    致謝

    在此,我要對所有為知識共享做出貢獻的個人和機構表示最深切的感謝。同時也感謝每一位花時間閱讀這篇文章的讀者,如果文章中有任何錯誤,歡迎留言指正。?

    學習永無止境,讓我們共同進步?。?/p>

    柚子快報激活碼778899分享:算法 Flask之模板

    http://yzkb.51969.com/

    好文推薦

    評論可見,查看隱藏內(nèi)容
  • 本文內(nèi)容根據(jù)網(wǎng)絡資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。

    轉(zhuǎn)載請注明,如有侵權,聯(lián)系刪除。

    本文鏈接:http://gantiao.com.cn/post/19049955.html

    發(fā)布評論

    您暫未設置收款碼

    請在主題配置——文章設置里上傳

    掃描二維碼手機訪問

    文章目錄