一理盆、請(qǐng)求鉤子
1.含義
交互過程中痘煤,有些準(zhǔn)備或者掃尾工作需要,比如請(qǐng)求開始: db鏈接猿规, auth認(rèn)證衷快,結(jié)束時(shí), 指定數(shù)據(jù)的交互格式,請(qǐng)求鉤子通過裝飾器實(shí)現(xiàn)的姨俩,有四種模式:
- 1.在第一次請(qǐng)求之前調(diào)用(在處理第一個(gè)請(qǐng)求之前執(zhí)行)蘸拔, 可以在此方法內(nèi)部做一些初始化操作
- 2、在每次請(qǐng)求之前執(zhí)行环葵,如果在某修飾的一個(gè)函數(shù)中返回了一個(gè)resp调窍, 視圖函數(shù)將不會(huì)被調(diào)用
- 3.執(zhí)行完視圖函數(shù)調(diào)用,并且把視圖函數(shù)所生成的響應(yīng)傳入积担,可以在此方法中對(duì)響應(yīng)做最后一步統(tǒng)一的處理
- 4.在每次請(qǐng)求之后執(zhí)行陨晶,接受一個(gè)參數(shù), 錯(cuò)誤信息,如果有相關(guān)的錯(cuò)誤就會(huì)拋出
2.例子
- 新建一個(gè)demo_gouzi.py文件,前兩個(gè)模式例子:
from flask import Flask
app = Flask(__name__)
# 請(qǐng)求鉤子
# 交互過程中先誉,有些準(zhǔn)備或者掃尾工作需要
# 比如請(qǐng)求開始: db鏈接湿刽, auth認(rèn)證,
# 結(jié)束時(shí), 指定數(shù)據(jù)的交互格式
# 請(qǐng)求鉤子通過裝飾器實(shí)現(xiàn)的, 4
# 1褐耳、在第一次請(qǐng)求之前調(diào)用(在處理第一個(gè)請(qǐng)求之前執(zhí)行)诈闺, 可以在此方法內(nèi)部做一些初始化操作
@app.before_first_request
def before_first_request():
print('before_first_request')
# 2、在每次請(qǐng)求之前執(zhí)行铃芦,如果在某修飾的一個(gè)函數(shù)中返回了一個(gè)resp雅镊, 視圖函數(shù)將不會(huì)被調(diào)用
@app.before_request
def before_request():
print('before_request')
@app.route('/')
def index():
return 'index'
if __name__ == '__main__':
app.run(debug=True)
-
當(dāng)我刷新網(wǎng)址的時(shí)候:
-
我們可以查看其content-type類型
第三個(gè)模式例子
# 執(zhí)行完視圖函數(shù)調(diào)用,并且把視圖函數(shù)所生成的響應(yīng)傳入
# 可以在此方法中對(duì)響應(yīng)做最后一步統(tǒng)一的處理
@app.after_request
def after_request(response):
print('after_request')
response.headers['Content-Type'] = "application/json"
return response
我們可以看到連content-type類型也進(jìn)行了更改
- 第四個(gè)模式例子
# 在每次請(qǐng)求之后執(zhí)行刃滓,接收一個(gè)參數(shù), 錯(cuò)誤信息仁烹,如果有相關(guān)的錯(cuò)誤就會(huì)拋出
@app.teardown_request
def teardown_request(response):
print('teardown_request')
二、請(qǐng)求上下文
三咧虎、狀態(tài)保持
1.cookie
http是一種無狀態(tài)協(xié)議
無狀態(tài):用戶一次請(qǐng)求卓缰,瀏覽器、服務(wù)器無法知道之前這個(gè)用戶做過什么
- cookie 在客戶端存儲(chǔ)的信息
- session 在服務(wù)端存儲(chǔ)的信息
例子
- 返回?cái)?shù)據(jù)
from flask import Flask,make_response
#django里面的http response
app = Flask(__name__)
@app.route('/cookie')
def set_cookie():
resp = make_response('this is to set cookie')
resp.set_cookie('username','gufei')
return resp
if __name__ == '__main__':
app.run()
-
從看看cookie過期時(shí)間
- 修改cookie過期時(shí)間
# max_age 設(shè)置cookie的時(shí)間
resp.set_cookie('username','gufei',max_age = 3600)
- 獲取cookie
from flask import Flask,make_response,request
...
#獲取cookie
@app.route('/request')
def get_cookie():
resp = request.cookies.get('username')
return resp
2.session
session 會(huì)話 (敏感重要的信息砰诵, 余額征唬。驗(yàn)證碼) ,session 依賴于cookie
- 設(shè)置session
from flask import Flask, make_response, request, session, redirect, url_for
...
# session 會(huì)話 (敏感重要的信息, 余額茁彭。驗(yàn)證碼) tf
# session 依賴于cookie
# 設(shè)置session
@app.route('/index1')
def index1():
session['lefmoney'] = '99999'
return redirect(url_for('index'))
# 需要設(shè)置secret_key 用于一些模塊 hash
app.secret_key = 'soda'
@app.route('/')
def index():
if session.get('lefmoney'):
return session.get('lefmoney')
return 'haha'
另一種方式:
return session.get('letmoney','0')
image.png
3.上下文
上下文:
- request context 請(qǐng)求上下文 总寒,cookie session
- application context 應(yīng)用上下文 current_app g
from flask import Flask, make_response, request, session, redirect, url_for, current_app
...
print(current_app.name)
四、flask script
- 新建一個(gè)demo_flask_script.py文件
from flask import Flask
# 導(dǎo)入
from flask_script import Manager
app = Flask(__name__)
# 把Manager 和 app進(jìn)行關(guān)聯(lián)
manager = Manager(app)
@app.route('/')
def index():
return 'haha'
if __name__ == '__main__':
manager.run()
當(dāng)我運(yùn)行的時(shí)候理肺,提示我沒有flask_script這個(gè)包摄闸,于是我安裝了一下
pip install flask_script
-
再次運(yùn)行
出現(xiàn)這種情況我們使用命令行啟動(dòng)程序
python demo_flask_script.py runserver -h 127.0.0.1 -p 8008
- 我們可以通過下面這個(gè)命令查看參數(shù):
python demo_flask_script.py runserver --help
五、JinJa2模板
-
新建一個(gè)名為templates的文件夾(名字不能錯(cuò))
傳值
- 新建一個(gè)demo_template2.py文件
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
#字符串
my_str = '陰陽師'
#num
my_int = 99
my_array = [i for i in range(9)]
my_dict = {
"name" : '大天狗',
"age" : 18
}
#render_template進(jìn)行模板渲染
return render_template('temp_demo1.html',
my_str = my_str,
my_int = my_int,
my_array = my_array,
my_dict = my_dict,
)
if __name__ == '__main__':
app.run()
- 再在templates文件夾中創(chuàng)建一個(gè)temp_demo1.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>jinja2模板</title>
</head>
<body>
游戲名:{{ my_str }}<br>
數(shù)字:{{ my_int }}<br>
數(shù)組:{{ my_array }}<br>
字典:{{ my_dict }}<br>
</body>
</html>
-
運(yùn)行程序
運(yùn)算
- 修改temp_demo1.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>jinja2模板</title>
</head>
<body>
游戲名:{{ my_str }}<br>
數(shù)字:{{ my_int }}<br>
數(shù)組:{{ my_array }}<br>
字典:{{ my_dict }}<br>
<hr>
my_int + 10 ={{ my_int + 10 }}<br>
my_int + array[0] = {{ my_int + my_array[2] }}<br>
ayyay[3] = {{ my_array.0 }}<br>
my_dict 中 name = {{ my_dict['name'] }}<br>
my_dict 中 age = {{ my_dict.age }}<br>
</body>
</html>
(此文章僅作為個(gè)人學(xué)習(xí)筆記使用哲嘲,如有錯(cuò)誤歡迎指正~)