加密後放在用戶瀏覽器的 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
基於 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()
更多的詳情 點擊這裏