Flask 中有三个 session:
第一个:数据库中的 session,例如:db.session.add()
第二个:在 flask_session 扩展中的 session,使用:from flask_session importSession,使用
第三方扩展的 session 可以把信息存储在服务器中,客户端浏览器中只存储 sessionid。
第三个:flask 自带的 session,是一个请求上下文, 使用:from flask import session。自带的
session 把信息加密后都存储在客户端的浏览器 cookie 中。
具体用法
一、 flask自带的session
主要用于服务器端的状态保持
# 增删改查的方法类似字典
app.secret_key = 'a key for session'
@app.route('/test_session')
def demo():
# 增
session['user_age'] = 18
session['user_height'] = 1.80
# 改
session['user_age'] = 20
# 查
user_age = session['user_age']
user_height = session.get('user_height')
# 删
session.pop('user_height', None)
return 'user_age:%s---user_height:%s' % (user_age, user_height)
二、 flask_session 扩展中的 session
flask中内置的session(即上面的session),是依据cookie存在的。
这个session支持保存到多个地方,例如:
- redis
- memcached
- filesystem
- mongodb
- sqlalchmey
1.保存数据到redis
import redis
from flask import Flask, session
from flask_session import Session
app = Flask(__name__)
app.secret_key = 'a key for session'
app.config['SESSION_TYPE'] = 'redis' # session类型为redis
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['user_name'] = 'laowang'
return 'success'
- 保存数据到sqlalchemy
from flask import Flask, session
from flask_session import Session as FSession
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.secret_key = 'a kye for session'
# 设置数据库链接
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123@127.0.0.1:3306/fssa?charset=utf8'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
# 实例化SQLAlchemy
db = SQLAlchemy(app)
app.config['SESSION_TYPE'] = 'sqlalchemy' # session类型为sqlalchemy
app.config['SESSION_SQLALCHEMY'] = db # SQLAlchemy对象
app.config['SESSION_SQLALCHEMY_TABLE'] = 'session' # session要保存的表名称
app.config['SESSION_KEY_PREFIX'] = 'session:' # 保存到session中的值的前缀
FSession(app)
@app.route('/index')
def index():
session['user_name'] = 'laowang'
session['user_age'] = 20
return 'success'
三、数据库SQLAlchemy中的session
简单理解就是
db.session.add()
db.session.commit
深入一点
在 flask_sqlalchemy.SQLAlchemy类的定义中有
self.session = self.create_scoped_session(session_options)
以及最后返回的
return orm.scoped_session(self.create_session(options), scopefunc=scopefunc)
可以追溯到 sqlalchemy.orm.session与sqlalchemy.orm.scoped_session的关系
# 测试代码 不能实现, 仅做演示
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
engine = create_engine(
"mysql+pymysql://root:root@127.0.0.1:3306/pro6?charset=utf8",
max_overflow=0, # 超过连接池大小外最多创建的连接
pool_size=5, # 连接池大小
)
#from sqlalchemy.orm.session import Session
SessionF = sessionmaker(bind=engine)
# session
session = SessionF()
print(session)
obj1 = Users(name='ctz', email='49274573@qq.com', extra='aaaa')
session.add(obj1)
session.commit()
session.close()