Flask-第三方插件

Flask-Session

由於flask自帶的session是將session存在cookie中;html

因此纔有了第三方Flask_session插件,能夠將session存儲在咱們想存儲的數據庫中(redis等)前端

pip install Flask-Session

將session保存在數據庫中

注意redis數據庫必定是在內網中的且是一臺單獨的服務器,防止被攻擊python

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查詢保存在數據庫中的sessionredis

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存儲以下:數據庫

相關文章
相關標籤/搜索