13.web開發之flask-2
支援html返回
@app.route('/a')
def a_page():
return Response('<h1>haha nihao</h1>'
'<br><hr>'
'<h2>ddddd</h2>', 200)
模板使用
呼叫模板
在templates檔案下新建一個HTML 5 file,名為tempa.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>a路由測試</title> </head> <body> <h1>this is a h1</h1> </body> </html>
此時直接return檔名即可,原因在於之前我們已經定義了template_folder
為templates
檔案
@app.route('/a')
def a_page():
return flask.render_template("tempa.html")
模板繼承
新建一個zi1.html,作為tempa的子模板
{% extends 'tempa.html'%}
hahanihao
tempa.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>a路由測試</title> </head> <body> <h1>I am father tempa</h1> </body> </html>
此時呼叫子模板,下面的hahanihao並不能顯示
@app.route('/a')
def a_page():
return flask.render_template("zi1.html")
對繼承模板進行修改
main.py
@app.route('/a')
def a_page():
return flask.render_template("zi1.html")
tempa.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>a路由測試</title> </head> <body> <!-- 開始渲染 --> <h1>I am father tempa</h1> <!-- 可以修改的位置 --> {% block contentBlock %} <h1>father html temp</h1> {% endblock %} <h1>I am father tempa last</h1> </body> </html>
zi1.html
{% extends 'tempa.html'%}
<!-- 開始修改的位置 -->
{% block contentBlock %}
<!-- 繼承父模板原有的內容 -->
{{super()}}
<!-- 寫在父模板可替換位置後面 -->
<h2>zi mu ban </h2>
<!-- 結束脩改的位置 -->
{% endblock %}
-
如果zi1.html不使用super()繼承父模板原有的內容,原內容將消失
{% extends 'tempa.html'%} <!-- 開始修改的位置 --> {% block contentBlock %} <h2>zi mu ban </h2> <!-- 結束脩改的位置 --> {% endblock %}
模板傳參與過濾器
Flask預設使用jinja模板語言,其中有關引數互動的開始與結束都是jinja模板
模板傳參
jinja模板引數互動幾個注意點
存放變數:{{ }}
控制程式碼塊:{% %}
註釋符:{# #}
main.py
@app.route('/a/<id>')
def a_page(id):
# python引數傳入都是string型別,
m_int = int(id) + 20
m_str = "hahanihao"
m_list = ["xiaoming", "xiaohong", "xiaoli"]
# mint會直接傳入tempa的{{mint}}中並替換
return flask.render_template("tempa.html", mint=m_int, mstr=m_str, mlist=m_list)
tempa.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>a路由測試</title>
</head>
<body>
<h1>I am father tempa {{mint}} ---- {{mstr}}</h1>
mlist is : {{mlist[1]}}
</body>
</html>
過濾器
tempa.html的body部分
<h1>I am father tempa {{mint}} ---- {{mstr}}</h1>
mlist is : {{mlist | dore}}
main.py
# 過濾器
@app.template_filter('dore')
def do_reverse(li):
temp = list(li)
temp.reverse()
return temp
過濾器原理:定義一個過濾器名為“dore”,呼叫時將HTML中的引數mlist傳入過濾器作為過濾器引數li,將其變成list並進行翻轉,之後再return到HTML中重新渲染,“ | ”即為過濾器
控制程式碼塊
控制程式碼塊為{% %},之前的模板繼承也是控制程式碼塊的一種
main.py
@app.route('/a/<id>')
def a_page(id):
# python引數傳入都是string型別,
m_int = int(id) + 20
m_str = "hahanihao"
m_list = ["xiaoming", "xiaohong", "xiaoli"]
vip = 1
# mint會直接傳入tempa的{{mint}}中並替換
return flask.render_template("tempa.html", mint=m_int, mstr=m_str, mlist=m_list,vip=vip)
tempa.html
<!-- 做遍歷 -->
{% for item in mlist %}
<li>{{item}}</li><hr>
{% endfor %}
{% for num in range(1,10) %}
<li>{{num}}號</li>
{% endfor %}
<!-- 做判斷 -->
{% if vip == 0 %}
<h1>你沒充值</h1>
{% elif vip == 1 %}
<h1>Lv1的內容</h1>
{% endif %}
Cookie與Session互動
cookie互動
main.py
@app.route('/b')
def b_page():
response = flask.make_response('success')
# 設定cookie,key為user_id,value為10,存活時間為60
response.set_cookie('user_id', '10', max_age=3600)
response.set_cookie('vip', '0', max_age=3600)
return response
@app.route('/a')
def a_page():
# 讀取cookie
user_id = request.cookies.get('user_id')
vip = request.cookies.get('vip')
return flask.render_template("tempa.html",user_id=user_id,vip=vip)
@app.route('/log_out')
def log_out():
response = flask.make_response('log out now')
response.delete_cookie('user_id')
response.delete_cookie('vip')
return response
tempa.html
{{user_id}}
<br>
{% if vip == '0' %}
{{'你不是vip'}}
{% elif vip == '1' %}
{{'您好'}}
{% endif %}
使用者在訪問/b
時相當於登入,同時建立cookie
和vip
值,隨後再訪問/a
讀取cookie
,並在前端顯示10(user_id)和vip的判斷(你不是vip),此時可以通過火狐自帶的cookie編輯器編輯vip值為1變成vip並跳出vip效果(您好),這時候訪問/log_out
相當於登出,再次訪問/a
因為沒有cookie值所以為None
session互動
main.py
from datetime import timedelta
# 配置加密字串
app.config['SECRET_KEY'] = "key123"
# 設定session存活時間7天有效,不通過timedelta預設是秒為單位
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=7)
@app.route('/log_in')
def b_page():
# 設定session
session['user_id'] = "20"
session['vip'] = '0'
return 'success'
@app.route('/a')
def a_page():
# 讀取session
user_id = session['user_id']
vip = session['vip']
return flask.render_template("tempa.html", user_id=user_id, vip=vip)
# 清理session
@app.route('/log_out')
def log_out():
# 法一:將session的不同key置空
#session.pop('user_id',None)
#session.pop('vip',None)
# 法二:將session的key設為不存在
#session['user_id'] = False
# 法三:直接清空所有的session
session.clear()
return 'log out success'
先訪問log_in
登入,儲存session值,訪問/a
相當於使用者介面,顯示user_id(20)和不是vip的內容(你不是vip),此時用檢視的cookie的方法發現內容加密且無法修改,說明session儲存在服務端(session讀取佔用伺服器資源),此時訪問/log_out
後session刪除