Flask中的Cookie和Session

1.Cookie

咱們都知道HTTP協議是無狀態的請求協議,用戶此次訪問和下一次訪問都是新的請求,它們之間是沒任何關係的。可是咱們須要知道上一次訪問用戶作了什麼操做,就須要用到cookie。cookie是網站以鍵值對格式存儲在瀏覽器中的一段純文本信息,用於實現用戶跟蹤。cookie是基於域安全的 咱們經過set_cookie方法設置cookiehtml

from flask import Flask, render_template, make_response

app = Flask(__name__)


@app.route('/setcookie', methods=['GET', 'POST'])  # 支持get、post請求
def setcookie():  # 視圖函數
    resp = make_response(render_template('cookie.html'))  # 顯式轉換成HttpResponse對象
    resp.set_cookie('nickname', 'laowang')  # 設置cookie
    resp.set_cookie('age', "12")  # 設置cookie
    return resp


app.config['DEBUG'] = True

if __name__ == '__main__':
    # 0.0.0.0表明任何能表明這臺機器的地址均可以訪問
    app.run(host='0.0.0.0', port=5000)  # 運行程序
複製代碼

咱們已經瀏覽器寫入了以下信息,當咱們下一次請求的時候,會自動把本地的cookie傳給後臺。 咱們經過HttpReqeust對象把咱們瀏覽器的cookies取到,咱們新寫一個視圖把cookie取到:web

@app.route('/getcookie', methods=['GET', 'POST'])  # 支持get、post請求
def getcookie():  # 視圖函數
    nickname = request.cookies.get('nickname')
    age = request.cookies.get('age')
    return 'nickname=%s age=%s' % (nickname, age)

複製代碼

過時時間:redis

cookie是有過時時間的,當咱們設置cookie的時候能夠直接給cookie設置過時時間,有以下幾種設置方法:sql

max_age是一個整數,表示在指定秒數後過時。mongodb

expires是一個datetime或timedelta對象,會話將在這個指定的日期/時間過時。數據庫

max_age與expires二選一。flask

若是不指定過時時間,在關閉瀏覽器時cookie會過時。瀏覽器

from flask import Flask, request, render_template, make_response
from datetime import datetime

app = Flask(__name__)


@app.route('/setcookie', methods=['GET', 'POST'])  # 支持get、post請求
def setcookie():  # 視圖函數
    resp = make_response(render_template('cookie.html'))  # 顯式轉換成HttpResponse對象
    resp.set_cookie('nickname', 'laowang', max_age=3600)  # 設置cookie 3600秒過時
    resp.set_cookie('age', "12", expires=datetime(2019, 3, 18))  # 設置cookie,2019年3月18後過時
    return resp


@app.route('/getcookie', methods=['GET', 'POST'])  # 支持get、post請求
def getcookie():  # 視圖函數
    nickname = request.cookies.get('nickname')
    age = request.cookies.get('age')
    return 'nickname=%s age=%s' % (nickname, age)


app.config['DEBUG'] = True

if __name__ == '__main__':
    # 0.0.0.0表明任何能表明這臺機器的地址均可以訪問
    app.run(host='0.0.0.0', port=5000)  # 運行程序
複製代碼

刪除Cookie 咱們能夠經過delete_cookie方法刪除cookie安全

@app.route('/delcookie', methods=['GET', 'POST'])  # 支持get、post請求
def delcookie():  # 視圖函數
    res = make_response('刪除cookie')
    res.delete_cookie('nickname')  # 刪除的cookie的本質就是改變cookie的過時時間
    return res
複製代碼

2.Session

上一篇,咱們說到cookie,除了cookie外還有一個叫session的機制。session也是能夠存儲一些信息的。對於一些敏感、重要的信息,咱們能夠存儲到session中。誰也不但願本身的餘額、銀行卡密碼存到cookie當中。bash

cookie和session結合使用:web開發發展至今,cookie和session的使用已經出現了一些很是成熟的方案。在現在的市場或者企業裏,通常有兩種存儲方式:

存儲在服務端:經過cookie存儲一個session_id,而後具體的數據則是保存在session中。若是用戶已經登陸,則服務器會在cookie中保存一個session_id,下次再次請求的時候,會把該session_id攜帶上來,服務器根據session_id在session庫中獲取用戶的session數據。就能知道該用戶究竟是誰,以及以前保存的一些狀態信息。這種專業術語叫作server side session。

將session數據加密,而後存儲在cookie中。這種專業術語叫作client side session。flask採用的就是這種方式,可是也能夠替換成其餘形式。 。

a.每一個網站都有登陸功能,當登陸成功,一段時間都不須要再登陸了。那登陸保持這個狀態咱們就能夠經過session來搞定。 flask裏面的session必需要設置SECRET_KEY

from flask import Flask, request, render_template, session, redirect
from datetime import datetime

app = Flask(__name__)

app.config['SECRET_KEY'] = 'laowangaigebi'  # 設置session加密的密鑰


@app.route('/login', methods=['GET', 'POST'])  # 支持get、post請求
def login():  # 登陸視圖函數
    # 模擬登陸成功後把uid和username存到session裏
    session['uid'] = '123456'
    session['username'] = 'laowang'
    return redirect('/')  # 登陸成功後到首頁


@app.route('/', methods=['GET', 'POST'])  # 支持get、post請求
def index():
    username = session.get('username')  # 取session
    if username:
        return 'welcome %s' % username
    else:
        return '請登陸'


app.config['DEBUG'] = True

if __name__ == '__main__':
    # 0.0.0.0表明任何能表明這臺機器的地址均可以訪問
    app.run(host='0.0.0.0', port=5000)  # 運行程序
複製代碼

過時時間

若是沒有設置session的有效期。那麼默認就是瀏覽器關閉後過時。 若是設置session.permanent=True,那麼就會默認在31天后過時。 若是不想在31天后過時,那麼能夠設置app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(hour=2)在兩個小時後過時。

刪除session

刪除session中的值:也是相似字典。能夠有三種方式刪除session中的值。 session.pop(key) del session[key] session.clear()

b.把session存在服務端

咱們能夠利用flask-session來把session存在服務器,畢竟session的數據比較重要,存在瀏覽器中不安全。

flask-session支持把session存在各類數據庫中

redis
memcached
filesystem
mongodb
sqlalchmey
複製代碼

咱們最好把session存在內存級的redis數據庫中,讀寫速度比較快

須要安裝pip install flask-session /pip install redis

from flask import Flask, request, session
import redis
from flask_session import Session

# 初始化Session對象
f_session = Session()

app = Flask(__name__)

app.config['SECRET_KEY'] = 'laowangaigebi'  # 加密的密鑰
app.config['SESSION_USE_SIGNER'] = True  # 是否對發送到瀏覽器上session的cookie值進行加密
app.config['SESSION_TYPE'] = 'redis'  # session類型爲redis
app.config['SESSION_KEY_PREFIX'] = 'session:'  # 保存到session中的值的前綴
app.config['PERMANENT_SESSION_LIFETIME'] = 7200  # 失效時間 秒
app.config['SESSION_REDIS'] = redis.Redis(host='127.0.0.1', port='6379', db=4)  # redis數據庫鏈接

# 綁定flask的對象
f_session.init_app(app)


@app.route("/")
def index():
    session['xingming'] = 'laozhao'
    return '存session'


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=True)

複製代碼
相關文章
相關標籤/搜索