Flask-Session
因為flask自帶的session是將session存在cookie中;
所以才有了第三方Flask_session插件,可以將session存儲在我們想存儲的數據庫中(redis等)
pip install Flask-Session
將session保存在數據庫中
注意redis數據庫一定是在內網中的且是一台單獨的服務器,防止被攻擊
from flask import Flask,session,request,render_template from flask_session import Session # 導入第三方插件 import redis # 導入redis模塊,操作redis數據庫的模塊 app = Flask(__name__) # 指定什么數據庫 app.config["SESSION_TYPE"] = "redis" # 指定數據庫的ip端口用哪個倉庫存儲及數據庫密碼,db表示redis的倉庫[0-15]通過select切換,用做數據隔離 app.config["SESSION_REDIS"] = redis.Redis(host="192.168.16.16",port=6380,db=6,password="123") # 設置session過期時間,默認31天, # app.config["PERMANENT_SESSION_LIFETIME"] = 20 # 20秒過期
# 替換Flask原有的session機制,原來session是保存在前端的cookie中的,現在我們指定session存儲在數據庫中 Session(app) @app.route("/login",methods=["POST","GET"]) def login(): if request.method=="GET": return render_template("login.html") else: # 設置session,保存在redis數據庫中,注意設置session用的是redis自帶的session模塊 session["username"] = 2222 # 直接從redis數據庫中查看session值 uname = session.get("username") # 2222 return "200 OK" if __name__ == '__main__': app.run("0.0.0.0",9527)
其他session設置
# app.config['SESSION_PERMANENT'] = False # 如果設置為True,則關閉瀏覽器session就失效。 # app.config['SESSION_USE_SIGNER'] = False # 是否對發送到瀏覽器上session的cookie值進行加密 # app.config['SESSION_KEY_PREFIX'] = 'session:' # 保存到session中的值的前綴
# session的類型 config.setdefault('SESSION_TYPE', 'null') # 在設置了session.permanent =True 后,它也會被保存在cookie中, # key 是 _permanent,如果不清除這個cookie,即使你在以后沒有設置為True, # session也會被從cookie 中的值設置為True的 config.setdefault('SESSION_PERMANENT', True) # 是否對發送到瀏覽器上 session:cookie值進行加密 config.setdefault('SESSION_USE_SIGNER', False) # 保存到session中的值的前綴 config.setdefault('SESSION_KEY_PREFIX', 'session:') # 文件路徑 config.setdefault('SESSION_FILE_DIR', os.path.join(os.getcwd(), 'flask_session')) # 存儲session的個數如果大於這個值時,就要開始進行刪除了 config.setdefault('SESSION_FILE_THRESHOLD', 500) # 文件權限類型 config.setdefault('SESSION_FILE_MODE', 384)
redis中的倉庫,用來數據隔離
通過前端的session Key查詢保存在數據庫中的session
import redis,pickle r = redis.Redis(host="192.168.16.16",port=6380,db=6,password="123") a = r.get("session:22d30ca0-323e-4244-b8de-831c8f964bc1") # 查詢出來的值是序列化后的,我們需要進行反序列化查看原始的值 print(pickle.loads(a)) # {'_permanent': True, 'username': 2222}
藍圖中的CBV模式設置session
藍圖
from flask import Blueprint,render_template,request,session from flask import views user = Blueprint("user",__name__) # 參數user表示藍圖唯一標識不能重復,實例化一個藍圖(Blueprint)對象 class User(views.MethodView): def get(self): return render_template("login.html") def post(self): username = request.form.get("username") password = request.form.get("password") if username == "henry" and password == "123456": # 設置session session["username"] = "henry" uname = session.get("username") print(uname) return "200 ok" else: return "404" user.add_url_rule("/login",view_func=User.as_view(name="login"))
程序啟動入口
from flask import Flask from use.uses import uses # 導入藍圖實例 from redis import Redis from flask_session import Session # 導入session第三方插件 app = Flask(__name__) # 指定什么數據庫 app.config["SESSION_TYPE"] = "redis" # 指定數據庫的ip端口用哪個倉庫存儲及數據庫密碼,redis的倉庫[0-15]通過select切換 app.config["SESSION_REDIS"] = Redis(host="192.168.16.16",port=6380,db=6,password="123") Session(app) # 注冊藍圖 app.register_blueprint(uses) if __name__ == '__main__': app.run('127.0.0.1',9000)
redis存儲如下: