11.4 Flask session,閃現

session

加密後放在用戶瀏覽器的 cookie 中 html

於django 的自帶session 不一樣,flask 的 session 須要導入python

from  flask import session

添加密鑰

app.secret_key = "sdfsdgrgasdgewrgw"

內部流程

# - Flask中的session處理機制(內置:將session保存在加密cookie中實現)
    # - 請求剛到來:獲取隨機字符串,存在則去「數據庫」中獲取原來的我的數據
    # 不然建立一個空容器。 --> 內存:對象(隨機字符串,{放置數據的容器})
        # 1. obj = 建立SecureCookieSessionInterface()
        # 2. obj = open_session(self.request) = SecureCookieSession()
        # self.session = SecureCookieSession()對象。
        # self.session = self.app.open_session(self.request)
    # - 視圖:操做內存中 對象(隨機字符串,{放置數據的容器})
    # - 響應:內存對象(隨機字符串,{放置數據的容器})
            # - 將數據保存到「數據庫」
            # - 把隨機字符串寫在用戶cookie中。

操做

徹底相似於字典操做redis

# 設置值:
session['key'] = 'xxx'

# 取值:
val = session.get('key','')
val = session['key']

# 刪除:
del session['key']

流程

請求到來 ---> 視圖函數 ----> 請求結束數據庫

當請求剛到來:

flask讀取cookie中session對應的值:eyJrMiI6NDU2LCJ1c2VyIjoib2xkYm95,將該值解密並反序列化成字典,放入內存以便視圖函數使用。django

視圖函數:

注意須要設置 secret_key 否則會報錯的。至關於加鹽操做密鑰。flask

設置 session 和取 session 都是基於字典操做,和 django 差很少瀏覽器

app.config['SECRET_KEY'] = os.urandom(24)


@app.route('/hello')
def hello_world():
    session["error"] = "hahah"
    print(session.values())
    return 'Hello World!'


@app.route('/hi')
def hi():
    return session.get("error", "沒有")

 能夠設置session 的保存時間,默認是31天cookie

app.config['PERMANENT_SESSION_LIFETIME']=timedelta(days=7) #設置session的保存時間。
session.permanent=True # 將這個調整爲 Trun 的時候纔可讓上面的時間生效

當請求結束:

flask會讀取內存中字典的值,進行序列化+加密,寫入到用戶cookie中。session

自定義session

自定義Session

 第三方session 

使用方式

基於 flask_session 的在 redis 中的session操做app

#!/usr/bin/env python
# -*- coding:utf-8 -
import redis
from flask import Flask, session
from flask_session import Session

app = Flask(__name__)
app.debug = True
app.secret_key = 'xxxx'

app.config['SESSION_TYPE'] = 'redis'  # session類型爲redis
app.config['SESSION_PERMANENT'] = False  # 若是設置爲True,則關閉瀏覽器session就失效。
app.config['SESSION_USE_SIGNER'] = False  # 是否對發送到瀏覽器上session的cookie值進行加密
app.config['SESSION_KEY_PREFIX'] = 'session:'  # 保存到session中的值的前綴
app.config['SESSION_REDIS'] = redis.Redis(host='127.0.0.1', port='6379', password='123123')  # 用於鏈接redis的配置

Session(app)


@app.route('/index')
def index():
    session['k1'] = 'v1'
    return 'xx'


if __name__ == '__main__':
    app.run()

 取捨

若是應用程序比較小,就用原生的加密ccokie 保存session(內置)

若是應用程序比較大,就用redis(flask-session)

閃現

在session中存儲一個數據,讀取時經過pop將數據移除

應用場景

一般用於對臨時數據的操做

實現的效果:

  建立後只能使用一次。使用完就消失了。

無類別的閃現

from flask import Flask, flash, redirect, render_template
     request, url_for

app = Flask(__name__)
app.secret_key = b'_5#y2L"F4Q8z\n\xec]/'

@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'] != 'secret':
            error = 'Invalid credentials'
        else:
            flash('You were successfully logged in')
            return redirect(url_for('index'))
    return render_template('login.html', error=error)

帶類別的

from flask import Flask,flash,get_flashed_messages,request,redirect
from werkzeug.datastructures import ImmutableMultiDict
app = Flask(__name__)
app.secret_key = 'asdfasdf'


@app.route('/index')
def index():
    val = request.args.get('v')
    if val == 'oldboy':
        return 'Hello World!'
    # 向某個地方設置一個值,category參數是分類的意思
    flash('超時錯誤',category="x1")
    return "ssdsdsdfsd"
    # return redirect('/error')


@app.route('/error')
def error():
    """
    展現錯誤信息
    :return:
    """
    # 從某個地方獲取設置過的全部值,並指定分類,並清除。
    data = get_flashed_messages(category_filter=['x1'])
    if data:
        msg = data[0]
    else:
        msg = "..."
    return "錯誤信息:%s" %(msg,)


if __name__ == '__main__':
    app.run()

 更多的詳情 點擊這裏

相關文章
相關標籤/搜索