web應(yīng)用框架——請(qǐng)求鉤子+狀態(tài)保持(cookie和session)+上下文+初識(shí)jinja2

一理盆、請(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ò)誤歡迎指正~)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末贪薪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子眠副,更是在濱河造成了極大的恐慌画切,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件囱怕,死亡現(xiàn)場(chǎng)離奇詭異霍弹,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)娃弓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門典格,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人台丛,你說我怎么就攤上這事耍缴±危” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵防嗡,是天一觀的道長变汪。 經(jīng)常有香客問我,道長蚁趁,這世上最難降的妖魔是什么裙盾? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮他嫡,結(jié)果婚禮上番官,老公的妹妹穿的比我還像新娘。我一直安慰自己钢属,他們只是感情好徘熔,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著署咽,像睡著了一般近顷。 火紅的嫁衣襯著肌膚如雪生音。 梳的紋絲不亂的頭發(fā)上宁否,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音缀遍,去河邊找鬼慕匠。 笑死,一個(gè)胖子當(dāng)著我的面吹牛域醇,可吹牛的內(nèi)容都是我干的台谊。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼譬挚,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼锅铅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起减宣,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤盐须,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后漆腌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贼邓,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年闷尿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了塑径。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡填具,死狀恐怖统舀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤誉简,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布绰筛,位于F島的核電站,受9級(jí)特大地震影響描融,放射性物質(zhì)發(fā)生泄漏铝噩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一窿克、第九天 我趴在偏房一處隱蔽的房頂上張望骏庸。 院中可真熱鬧,春花似錦年叮、人聲如沸具被。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽一姿。三九已至,卻和暖如春跃惫,著一層夾襖步出監(jiān)牢的瞬間叮叹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國打工爆存, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蛉顽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓先较,卻偏偏與公主長得像携冤,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子闲勺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344