1 重定向
1.1 什么是重定向?
重定向,顧名思義,就是重新定向到一個新的位置,比如我們在瀏覽器的頁面自動跳轉到了另一個頁面,又比如訪問了一個頁面,然后觀察網址之后並不是我們輸入的網址,這個過程就是重定向完成的。
1.2 為什么要有重定向?
http狀態碼 | 應用場景 | 優勢 | |
---|---|---|---|
暫時性重定向 | 302 | 訪問一些需要權限的頁面,會自動重定向到權限認證的頁面 | 重定向在設計上會提升用戶體驗 |
永久性重定向 | 301 | 廢棄原有的網址被訪問,會自動重定向到新的網址確保用戶訪問成功 | 重定向在設計上會提升用戶體驗,有利於搜索引擎優化 |
例1:訪問淘寶的時候,你選擇了已經購買的商品,但是你並沒有登錄過淘寶,那么這個時候如果只是提示 “請登錄再訪問!”,那么相信這種設計是留不住用戶的,不如直接為用戶重定向到登錄頁面。
例2:比如想廢棄原本的網址,那么用戶並不知道這個事情,所以用戶還是會訪問原來的網址,那么就會內部做一個重定向到新啟用的網址,重定向的過程會有狀態碼的返回,搜索引擎捕捉到重定向的代碼,有利於搜索引擎優化。
關鍵詞:重定向在設計上會提升用戶體驗 ,有利於搜索引擎優化
1.3 如何使用重定向?
首先從flask
模塊中把導入redirect
from flask import Flask,redirect
1.3.1 暫時性重定向(代碼實例):
from flask import Flask,redirect
...
@app.route('/user_info/')
def user_info():
name = request.args.get('name')
pwd = request.args.get('pwd')
if name=='mark' and pwd == '123':
return '{}的信息'.format(name)
return redirect('/login/') # 可以換成 return redirect(url_for('login'))
@app.route('/login/')
def login():
return '這是登錄頁面'
...
沒有通過權限驗證的情況
通過權限驗證的情況
關鍵詞:暫時性重定向return redirect('/login/')
即可實現重定向
1.3.2 永久性重定向(代碼實例)
from flask import Flask,redirect
...
@app.route('/user_info/')
def user_info():
name = request.args.get('name')
pwd = request.args.get('pwd')
if name=='mark' and pwd == '123':
return '{}的信息'.format(name)
return redirect('/login/', code=301) # 會返回301狀態碼給瀏覽器
@app.route('/login/')
def login():
return '這是登錄頁面'
...
關鍵詞:永久性重定向只給redirect('/login/', code=301)
多加了個code=301
參數
2 jinja2模板引擎
2.1 什么是模板引擎?
實現視圖的業務邏輯和返回給前端的頁面邏輯分離的工具,稱之為模板引擎。
什么是模板?
模板可以理解為一個特殊的html
文件,特殊之處就在於這個html
文件包含固定內容和動態部分,其動態部分可以借助模板引擎進行傳參
2.2 為什么要有模板引擎?
在上一章其實已經應用過模板引擎,試想一下如果沒有模板引擎,直接給把模板的html代碼寫在視圖函數里面,會給程序員的日常開發帶來了多大的困擾,模板引擎幫我們分開了業務邏輯和頁面邏輯,並且每次修改一個大字符串會非常不方便。模板引擎還可以讀取並執行模板中的特殊語法標記,並根據傳入的數據將變量替換為實際值,然后返回給瀏覽器,這個過程稱之為渲染。
關鍵字:完成了業務邏輯和頁面邏輯的分離,實現了動態的去渲染頁面。
2.3 在Flask
如何使用模板引擎?
Flask
使用jinja2
作為框架的默認模板引擎,Jinja2
是基於python
的模板引擎,功能比較類似於於PHP
的smarty
,J2ee
的Freemarker
和velocity
。Jinja2
除了設置變量,還允許我們在模板中添加if判斷,執行for迭代,調用函數等,以各種方式控制模板的輸出。並且jinja2
不限制模板的格式為html
,可以是任何格式的文本文件。
2.3.1 模板引擎返回對比視圖函數直接返回html代碼
項目目錄
項目代碼
**(1)login01.html **
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登錄界面</title>
</head>
<body>
<h1>login01</h1>
<form action="" method="POST">
用戶:<input type="text" name="username">
密碼:<input type="text" name="password">
<input type="submit" value="提交">
</form>
</body>
</html>
(2)login02.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登錄界面</title>
</head>
<body>
<h1>login02</h1>
<form action="" method="POST">
用戶:<input type="text" name="username">
密碼:<input type="text" name="password">
<input type="submit" value="提交">
</form>
</body>
</html>
(3) server.py
from flask import Flask, render_template
import config
app = Flask(__name__)
app.config.from_object(config)
@app.route('/demo/')
def demo():
return '<h2>手寫html</h2>'
@app.route('/demo02/')
def demo02():
return '''<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登錄界面</title>
</head>
<body>
<!--<form action="/login_request/" method="POST">-->
<form action="" method="POST">
用戶:<input type="text" name="username">
密碼:<input type="text" name="password">
<input type="submit" value="提交">
</form>
</body>
</html>'''
@app.route('/demo03/')
def demo03():
return render_template('login01.html')
@app.route('/demo04/')
def demo04():
return render_template('box/login02.html')
if __name__ == '__main__':
app.run()
server.py代碼邏輯分析:
- demo函數 和 demo02函數證明直接返回html代碼可渲染瀏覽器
- demo03 證明利用模板引擎 實現了業務邏輯和頁面邏輯的分離,減輕了開發的復雜度
- demo04 證明了
render_template('box/login02.html')
的路徑是templates文件夾的相對路徑
2.3.2 修改默認模板引擎尋找路徑
Flask類中的template_folder
參數可以指定模板尋找路徑
基於上述2.3.1
- 現在把templates中的文件復制到
C:/Users/Administrator/Desktop/template_box
中,並且刪除項目中的templates的文件。 - 修改server.py中
app = Flask(__name__)
為
app = Flask(__name__,template_folder='C:/Users/Administrator/Desktop/template_box')
分析:
渲染一切正常 說明Flask類中的template_folder
參數可以指定模板尋找路徑。
2.3.3 模板引擎傳參
之前提到過,模板引擎還可以讀取並執行模板中的特殊語法標記,並根據傳入的數據將變量替換為實際值,這個步驟稱之為模板引擎傳參。
傳參的時候要應用render_template()
利用render_template的第二個參數進行傳參,該函數在定義時候,第二個參數是可變長形參,所以在傳值的時候可以傳入多個關鍵字實參。
在模板中接收的時候使用{{}}
包裹參數進行接收。
實例1(第一種傳參方式):
目錄結構
│ server.py
│
└─templates # 文件夾
index.html
server.py
@app.route('/')
def index():
return render_template('index.html',name="mark",age=18)
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>模板傳參</title>
</head>
<body>
{{name}}
{{age}}
</body>
</html>
實例2(第二種傳參方式):
目錄結構:同上
server.py
@app.route('/demo1/')
def demo1():
context_dict = {"name":"mark",
"age":"mark",
"sex":"girl"}
return render_template('index.html',context_dict = context_dict)
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>模板傳參</title>
</head>
<body>
{{context_dict.name}}
{{context_dict.age}}
{{context_dict.sex}}
</body>
</html>
實例3(第三種傳參方式):
目錄結構:同上
server.py
def demo2():
context_dict = {"name": "mark",
"age": "mark",
"sex": "girl",
"other_info":{"tel":1365,
"qq":565656}}
return render_template('index.html',**context_dict)
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>模板傳參</title>
</head>
<body>
{{name}}
{{age}}
{{sex}}
{{other_info.tel}}
{{other_info["qq"]}}
</body>
</html>
關鍵詞:
在視圖函數中
- render_template傳參的時候以關鍵字實參進行傳參。可以傳多個,可以用**講字典打散成關鍵字實參。
在模板中
- jinja2模板引擎支持接收變量在用
{{}}
包裹參數進行接收 - 並且如果發現是字典,可以用
.
字典里面的key取出value值。也可以直接字典跟[]
進行取值。
2.3.4模板中使用url_for()
在模板中如果有使用url的需求,我們可以直接手寫一個url,也可以使用{{ url_for('視圖函數名') }
動態翻轉一個url。
實例:
項目目錄:
│ server.py
│
└─templates # 文件夾
index.html
info.html
server.py
...
@app.route('/')
def index():
return render_template('index.html', name="mark", age=18)
@app.route('/info/')
def info():
return render_template('info.html')
...
info.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>信息頁面</title>
</head>
<body>
<h1>這是信息頁面</h1>
</body>
</html>
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>模板傳參</title>
</head>
<body>
<a href="/info/">正常跳轉</a>
<a href="{{ url_for('info') }}">urlfor跳轉</a>
</body>
</html>
正常跳轉 和 urlfor跳轉,皆可以實現跳轉到info.html頁面。
正常跳轉不做演示
關鍵詞:
- url_for 在視圖函數中如何使用,在模板中同樣的用法。
- 支持翻轉查詢字符串
- 支持動態路由翻轉
2.3.5 jinja2中控制語句
在jinja2中用{% %}
特殊符號來編輯控制語句,一個語句以{% ... %}
為起始 並且以{% end... %}
來標記結束。
1 jinja2中邏輯語句/if語句
可以使用> , < , <=, ==,!=,
進行判斷,
也可以使用 and,or,not,()
來進行邏輯合並
{% if age > 18 %}
<p>成年人</p>
{% elif age == 18 %}
<p>剛剛成年</p>
{% else %}
<p>未成年</p>
{% endif %}
注意:<p>
只是為了渲染明顯
實例:
項目目錄:
│ server.py
│
└─templates # 文件夾
index.html
server.py
...
@app.route('/')
def hello_world():
context_dict = {
'age': 18,
'sex': 'man',
}
return render_template('index.html',**context_dict)
...
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>jinja2分支</title>
</head>
<body>
{% if sex == 'man' %}
<p>男人</p>
{% else %}
<p>女人</p>
{% endif %}
{% if age > 18 %}
<p>成年人</p>
{% elif age == 18 %}
<p>剛剛成年</p>
{% else %}
<p>未成年</p>
{% endif %}
</body>
</html>
2 jinja2中循環語句/for循環
for
循環可以便利任何一個可迭代對象,包括列表、字典等,支持反向遍歷
列表循環:
{% for country in countrys%}
<p>{{ country }}</p>
{% else %}
<p>沒有值</p>
{% endfor %}
2.1 列表循環遍歷項目實例:
項目目錄:
│ server.py
│
└─templates # 文件夾
index.html
sever.py
@app.route('/')
def hello_world():
context_dict = {
'countrys':["1-china","2-America","3-French"]
}
return render_template('index.html',**context_dict)
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>for循環</title>
</head>
<body>
{% for country in countrys %} {# {% for country in countrys|reverse %} 可以實現反向遍歷#}
<p>{{ country }}</p>
{% else %}
<p>沒有值</p>
{% endfor %}
</body>
</html>
反向遍歷實例
server.py`的 `{% for country in countrys %}` 改為 `{% for country in countrys|reverse %}
可以實現反向遍歷,運行效果如下圖
2.2 字典循環遍歷項目實例:
項目目錄
│ server.py
│
└─templates # 文件夾
index.html
sever.py
@app.route('/')
def hello_world():
context_dict = {
'countrys':["1-china","2-America","3-French"]
}
return render_template('index.html',**context_dict)
@app.route('/demo/')
def demo():
context_dict ={
'colleges':[
{
'name': '清華大學',
'area': '北京'
},
{
'name': '復旦大學',
'area': '上海'
},
{
'name': '吉林大學',
'area': '吉林'
},
{
'name': '中山大學',
'area': '廣東'
}
]
}
return render_template('index.html',**context_dict)
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>for循環</title>
</head>
<body>
<table>
<tr>
<th>1開始的序號</th>
<th>0開始的序號</th>
<th>大學名稱</th>
<th>所屬地區</th>
<th>總數</th>
</tr>
{% for college in colleges %}
{% if loop.first %}
<tr style="background: blue">
{% elif loop.last %}
<tr style="background: yellow ">
{% else %}
<tr>
{% endif %}
<td>{{ loop.index }}</td>
<td>{{ loop.index0 }}</td>
<td>{{ college.name }}</td>
<td>{{ college.area }}</td>
<td>{{ loop.length }}</td>
</tr>
{% endfor %}
</table>
</body>
</html>
for循環常用變量表
for循環常用變量 | 功能描述 |
---|---|
loop.index | 當前循環的索引(從1開始) |
loop.index0 | 當前循環的索引(從0開始) |
loop.first | 是否是第一次循環,是返回True,否則返回Flase |
loop.last | 是否是最后一次循環,是返回True,否則返回Flase |
loop.length | 總共可以循環的次數 / 迭代器的長度 |
for循環中的else用法
for還可以else分支語法,如果for內部沒有遍歷出來內容,那么就會走else分支,反之如果for循環遍歷出了內容,則不會運行else分支。
注意:jinja2
中的for
和 else
邏輯不通於python
在此不要類比python中的 for
和 else
。
{% for country in countrys|reverse %}
<p>{{ country }}</p>
{% else %}
<p>沒有值</p>
{% endfor %}
2.3.6 模板加載靜態文件
在模板中加載靜態文件的時候也要使用到url_for()
函數,去尋找具體的靜態文件資源。第一個參數是定位到static
文件夾,filename
參數定位到static文件夾內的具體資源。
{{ url_for('static',filename='相對於static文件夾的路徑') }}
實例:
項目目錄:
│ app.py
│
├─static # 文件夾
│ ├─css # 文件夾
│ │ demo.css
│ │
│ ├─images # 文件夾
│ │ 1.png
│ │
│ └─js # 文件夾
│ demo.js
│
├─templates # 文件夾
index.html
app.py
...
@app.route('/')
def hello_world():
return render_template('index.html')
...
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>靜態文件加載</title>
<link rel="stylesheet" href="{{ url_for('static',filename='css/demo.css') }}">
<script src="{{ url_for('static',filename='js/demo.js') }}"></script>
</head>
<body>
<img src="{{ url_for('static',filename='images/1.png') }}">
</body>
</html>
demo.css
body{
background: red;
}
demo.js
alert('hello world')
2.3.7 模板的繼承
jinja2的模板繼承可以把一些公共的代碼定義到一個基模板中,比如把導航欄、頁腳等通用內容放在基模板中,以后所有的子模板直接繼承基模板,在子模板被渲染時會自動包含繼承基模板的內容,通過模板的繼承可以避免在多個模板中編寫重復的代碼。
具體實現:
在基模板中定義一些公共的代碼,子模板會繼承這些公共的代碼,但是子模板需要根據自己的需求去實現不同的代碼,這個時候就需要在基模板中提供一些接口,以便子模板實現自己的業務需求。
1 基本寫法
在基/父模板中定義接口(block)
{% block main %} {# main是自定義的變量名 #}
{% endblock %}
在子模板中繼承父模板,並且重寫接口(block)
{% extends 'base.html' %} {# extends 后面跟的參數是導入的基模板相對於templates的路徑 #}
{% block main %}
{% endblock %}
2 子模板中調用父模板代碼block中的代碼
基模板中
{% block main %}
<p>父模板中main中原有的內容</p>
{% endblock %}
子模板中:
{% block main %}
{{ super() }} {# 保留基模板中本塊的代碼 #}
<p>子模板中重寫main的內容 </p>
{% endblock %}
3 在子模板中調用其他block中的代碼:
子模板中:
{% block main %}
{{ self.demo() }} {# self.其他block名字 #}
<p>子模板中重寫main的內容 </p>
{% endblock %}
4 子模板中的想定義自己的代碼只能放到block中,否則無效
實例
注意:這里面使用了bootstrap框架。
bootstrap3的中文官網:https://v3.bootcss.com/
1 首先下載 用於生產環境的 Bootstrap
2 解壓出來里面的css文件
項目目錄
│ app.py
│
├─static # 文件夾
│ └─css
│ bootstrap-theme.css
│ bootstrap-theme.css.map
│ bootstrap-theme.min.css
│ bootstrap-theme.min.css.map
│ bootstrap.css
│ bootstrap.css.map
│ bootstrap.min.css
│ bootstrap.min.css.map
│
├─templates # 文件夾
base.html
detail.html
css文件夾: 是從上面下載好的用於生產環境的 Bootstrap
中解壓出來的
base.html 注意:里面的form
標簽中的內容和nav
標簽中的內容均是bootstrap框架的代碼截取,div
標簽是用於清除浮動
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>父模板</title>
<link rel="stylesheet" href="{{ url_for('static',filename='css/bootstrap.css') }}">
</head>
<body>
<form class="navbar-form navbar-left" role="search">
<div class="form-group">
<input type="text" class="form-control" placeholder="Search">
</div>
<button type="submit" class="btn btn-default">Submit</button>
</form>
<div style=" visibility:hidden;display:block;font-size:0;clear:both;
height:50px"></div>
{% block main %}
<p>父模板中main中原有的內容</p>
{% endblock %}
<br>
<br>
<br>
{% block demo %}
<p>demo中原有的內容</p>
{% endblock %}
<div style=" visibility:hidden;display:block;font-size:0;clear:both;
height:0"></div>
<nav aria-label="Page navigation">
<ul class="pagination">
<li>
<a href="#" aria-label="Previous">
<span aria-hidden="true">«</span>
</a>
</li>
<li><a href="#">1</a></li>
<li><a href="#">2</a></li>
<li><a href="#">3</a></li>
<li><a href="#">4</a></li>
<li><a href="#">5</a></li>
<li>
<a href="#" aria-label="Next">
<span aria-hidden="true">»</span>
</a>
</li>
</ul>
</nav>
</body>
</html>
detail.html
{% extends 'base.html' %}
{% block demo %}
<p>子模板中重寫demo的內容</p>
{% endblock %}
{% block main %}
{{ super() }} {# 保留基模板中本block的代碼 #}
{{ self.demo() }} {# 調用demo block的代碼 #}
<p>子模板中重寫main的內容 </p>
{% endblock %}
app.py 注意:app.config.update(TEMPLATES_AUTO_RELOAD=True)
語句用於每次都重新加載模板文件
from flask import Flask, render_template
app = Flask(__name__)
app.config.update(TEMPLATES_AUTO_RELOAD=True)
@app.route('/')
def hello_world():
return render_template('base.html')
@app.route('/demo/')
def demo():
return render_template('detail.html')
if __name__ == '__main__':
app.run()
子模板運行效果
3 閃現
3.1 在模板中獲取閃現信息
Flask 提供了一個非常簡單的方法來使用閃現系統向用戶反饋信息。閃現系統使得在一個請求結束的時候記錄一個信息,然后在且僅僅在下一個請求中訪問這個數據
,強調flask閃現是基於flask
內置的session
的,利用瀏覽器的session
緩存閃現信息。所以必須設置secret_key
。
3.1.1 簡單的在模板中實現獲取閃現信息
實例:
server.py
from flask import Flask, flash, redirect, render_template, request, url_for
app = Flask(__name__)
app.secret_key = 'some_secret'
@app.route('/')
def index():
return render_template('index.html')
@app.route('/login', methods=['GET', 'POST'])
def login():
error = None
if request.method == 'POST':
if request.form['username'] != 'admin' or request.form['password'] != '123':
error = '登錄失敗'
else:
flash('恭喜您登錄成功')
return redirect(url_for('index'))
return render_template('login.html', error=error)
if __name__ == "__main__":
app.run()
注意:這個 flash()
就可以實現在下一次請求時候,將括號內的信息做一個緩存。不要忘記設置secret_key
這里是 index.html 模板:
{% with messages = get_flashed_messages() %} # 獲取所有的閃現信息返回一個列表
{% if messages %}
<ul class=flashes>
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
<h1>主頁</h1>
<p>跳轉到登錄頁面<a href="{{ url_for('login') }}">登錄?</a>
注意:{% with messages = get_flashed_messages() %} # 獲取所有的閃現信息返回一個列表
這里是login.html 模板
<h1>登錄頁面</h1>
{% if error %}
<p class=error><strong>Error:</strong> {{ error }}
{% endif %}
<form action="" method=post>
用戶名:
<input type=text name=username>
密碼:
<input type=password name=password>
<p><input type=submit value=Login></p>
</form>
簡單的在模板中實現獲取閃現信息小結:
設置閃現內容:flash('恭喜您登錄成功')
模板取出閃現內容:{% with messages = get_flashed_messages() %}
3.1.2 模板中的分類閃現
當閃現一個消息時,是可以提供一個分類的。未指定分類時默認的分類為 'message'
。 可以使用分類來提供給用戶更好的反饋,可以給用戶更精准的提示信息體驗。
要使用一個自定義的分類,只要使用 flash()
函數的第二個參數:
flash('恭喜您登錄成功',"status")
flash('您的賬戶名為admin',"username")
在使用get_flashed_messages()
時候需要傳入with_categories=true
便可以渲染出來類別
{% with messages = get_flashed_messages(with_categories=true) %}
{% if messages %}
<ul class=flashes>
{% for category, message in messages %}
<li class="{{ category }}">{{ category }}:{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
模板中的分類閃現小結:
分類設置閃現內容:flash('恭喜您登錄成功',"status")
flash('您的賬戶名為admin',"username")
模板取值: {% with messages = get_flashed_messages(with_categories=true) %}
{% if messages %}
<ul class=flashes>
{% for category, message in messages %}
...
3.1.3 模板中過濾閃現消息
同樣要使用一個自定義的分類,只要使用 flash()
函數的第二個參數:
flash('恭喜您登錄成功',"status")
flash('您的賬戶名為admin',"username")
在使用get_flashed_messages()
時候需要傳入category_filter=["username"]
便可根據類別取出閃現信息。中括號內可以傳入的值就是類別,可以傳入多個。
{% with messages = get_flashed_messages(category_filter=["username"]) %}
{% if messages %}
<ul>
{% for message in messages %}
<li>{{ message }}</li>
{% endfor -%}
</ul>
</div>
{% endif %}
{% endwith %}
小結:
分類設置閃現內容:flash('恭喜您登錄成功',"status")
flash('您的賬戶名為admin',"username")
模板取值: % with messages = get_flashed_messages(category_filter=["username"]) %}
{% if messages %}
<ul>
{%- for message in messages %}
3.2 在視圖中獲取閃現信息
3.2.1 簡單的在是視圖中獲取閃現信息
-設置: flash('xxx')
-取值:get_flashed_message() # 注意這個不同於模板取值,這個是從flask中導入的
-注意:在視圖中獲取閃現信息不必非得是兩次連續的請求,只要保證是第一次取相應的閃現信息,就可以取得到。
實例:
from flask import Flask, request, flash, get_flashed_messages
import os
app = Flask(__name__)
app.secret_key = os.urandom(4)
app.debug = True
@app.route('/login/')
def login():
if request.args.get('name') == 'rocky':
return 'ok'
flash('第一條閃現信息:用戶名不是rocky填寫的是{}'.format(request.args.get('name')))
# flash('第二條閃現信息:用戶名不是rocky填寫的是{}'.format(request.args.get('name')))
return 'error,設置了閃現'
@app.route('/get_flash/')
def get_flash():
#get_flashed_messages()是一個列表列表可以取出閃現信息,該條閃現信息只要被取出就會刪除掉。
return '閃現的信息是{}'.format(get_flashed_messages())
@app.route('/demo/')
def demo():
return 'demo'
if __name__ == '__main__':
app.run()
(1)**會觸發設置閃現內容
(2)取出閃現內容
(3)再次取出閃現內容,發現閃現內容取出一次后就為空了
小結:
- get_flashed_messages()是一個列表,該列表可以取出閃現信息,該條閃現信息只要被取出就會刪除掉。
3.2.2 在視圖中實現分類獲取閃現信息。
-設置:flash('用戶名錯誤', "username_error")
flash('用戶密碼錯誤', "password_error") # 第二個參數為閃現信息的分類。
-取所有閃現信息的類別和閃現內容:get_flashed_messages(with_categories=True)
-針對分類過濾取值:get_flashed_messages(category_filter=['username_error'])
# 中括號內可以寫多個分類。
-注意:如果flash()沒有傳入第二個參數進行分類,默認分類是 'message'
實例1
@app.route('/login/')
def login():
if request.args.get('name') == 'rocky':
return 'ok'
flash('用戶名錯誤', category="username_error")
flash('用戶密碼錯誤', "password_error")
return 'error,設置了閃現'
@app.route('/get_flash/')
def get_flash():
return '閃現的信息是{}'.format(get_flashed_messages(with_categories=True))
把所有的閃現類別和閃現信息返回。
實例2
@app.route('/login/')
def login():
if request.args.get('name') == 'rocky':
return 'ok'
flash('用戶名錯誤', category="username_error")
flash('用戶密碼錯誤', "password_error")
return 'error,設置了閃現'
@app.route('/get_flash/')
def get_flash():
return '閃現的信息是{}'.format(get_flashed_messages(category_filter=['username_error']))
返回頁面只顯示了 "username_error"
的分類內容。