共计 3126 个字符,预计需要花费 8 分钟才能阅读完成。
一.flask-session 组件的作用
flask-session 是 flask 框架的 session 组件,由于原来 flask 内置 session 使用签名 cookie 保存,该组件则将支持 session 保存到多个地方
- redis
- memcached
- filesystem
- mongodb
- sqlalchmey
- ....
二. 安装
pip3 install flask-session
三.flask-session 的使用
👉更多存储方式介绍 : https://www.jb51.net/article/153452.htm
1. 保存 Redis 中
- 使用方式一:
from flask import Flask, session, request, render_template
from flask_session import RedisSessionInterface
import redis
app = Flask(__name__)
app.debug = True
conn = redis.Redis(host='127.0.0.1', port=6379)
# conn 传的就是 redis 连接, 源码里边做判断, 如果没传则自动帮你创建一个 redis 连接
# use_signer 参数: 是否对 key 签名
# key_prefix
app.session_interface = RedisSessionInterface(conn, key_prefix='abc')
@app.route('/index/', methods=['post', 'get'])
def index():
if request.method == "GET":
return render_template('index.html')
else:
session['username'] = request.form.get('username')
session['password'] = request.form.get('password')
# 在 redis 保存的键名 (类似于 jwt 的三段式) :
# abceyJuYW1lIjoic2hhd24ifQ.YLkAOA.YQYs5z7EbIWcqJENQmNXZmiWt7A
get_session()
return 'ok'
def get_session():
print(session['username'])
print(session['password'])
if __name__ == '__main__':
app.run()
- 使用方式二 :
# 将 app.session_interface = RedisSessionInterface(conn, key_prefix='abc') 替换成下面语句:
from flask.ext.session import Session
app.config['SESSION_TYPE'] = 'redis' # 设置 session 类型为 redis
app.config['SESSION_REDIS'] = conn # 设置连接 redis 的配置
Session(app)
- 使用配置类的方式书写
## settings.py
from datetime import timedelta
from redis import Redis
class Config(object):
DEBUG = True
SECRET_KEY = "random_key"
PERMANENT_SESSION_LIFETIME = timedelta(minutes=20)
SESSION_REFRESH_EACH_REQUEST = True
SESSION_TYPE = "redis"
# 生产环境
class ProductionConfig(Config):
SESSION_REDIS = Redis(host='192.168.0.94', port='6379')
# 开发环境
class DevelopmentConfig(Config):
SESSION_REDIS = Redis(host='127.0.0.1', port='6379')
# 测试环境
class TestingConfig(Config):
pass
## run.py
from flask import Flask, session, request, render_template
from datetime import timedelta
app = Flask(__name__)
app.config.from_object('settings.DevelopmentConfig')
from flask.ext.session import Session
Session(app)
@app.route('/index/', methods=['post', 'get'])
def index():
if request.method == "GET":
return render_template('index.html')
else:
# get_session()
session['username'] = request.form.get('username')
session['password'] = request.form.get('password')
session.permanent = True
app.permanent_session_lifetime = timedelta(minutes=1) # 设置 session 到期时间
# 在 redis 保存的键名 (类似于 jwt 的三段式) : abceyJuYW1lIjoic2hhd24ifQ.YLkAOA.YQYs5z7EbIWcqJENQmNXZmiWt7A
get_session()
return 'ok'
def get_session():
print(session['username'])
print(session['password'])
if __name__ == '__main__':
app.run()
四. 设置 cookie 存活时间
1. 设置 cookie 在关闭浏览器时失效
# 直接设置 cookie, exipre: 失效, 终止
response.set_cookie('k','v',exipre=None)
# 在 session 中设置,permanent: 永久的 (默认是 True)
app.session_interface=RedisSessionInterface(conn,key_prefix='lqz',permanent=False)
一般我们不会使用第一种方式, 而是设定超时时间
2. 查看及设置默认超时时间
- 查看
# 可以通过查看源码发现默认的超时时间
# expires = self.get_expiration_time(app, session)
timeout = app.config['PERMANENT_SESSION_LIFETIME']
print(timeout) # 31 days, 0:00:00
- 設置
# cookie 直接设置
# exipre 传入一个时间对象来指定过期时间
expires = datatime.now()+timedelta(days=30,hourse=10)
response.set_cookie('k','v',exipre=expires)
# max_age 参数传入时间来指定过期时间, 单位为秒 (若 exipre 和 max_age 都存在, 后者优先)
response.set_cookie('k','v',max_age=60)
# session 设置 (在 index 视图函数中写入下面两行)
session.permanent = True
app.permanent_session_lifetime = timedelta(minutes=1) # 设置 session 到期时间
正文完