Flask-Session是Flask的一个扩展,它为应用程序添加了对服务器端会话的支持。
- 安装
- pip install Flask-Session
快速入门
基本上,对于拥有一个Flask应用程序的常见用途,您只需创建Flask应用程序,加载所选配置,然后通过将其传递给应用程序来创建Session对象。
会话实例不用于直接访问,您应该始终使用flask.session
from flask import Flask, session from flask.ext.session import Session app = Flask(__name__) # Check Configuration section for more details SESSION_TYPE = 'redis' app.config.from_object(__name__) Session(app) @app.route('/set/') def set(): session['key'] = 'value' return 'ok' @app.route('/get/') def get(): return session.get('key', 'not set')
您也可以使用init_app()方法设置您的应用程序:
sess = Session() sess.init_app(app)
配置
Flask-Session存在以下配置值。Flask- session从Flask应用程序配置中加载这些值,因此在将应用程序传递给Flask- session之前,应该先配置应用程序。注意,在应用init_app之后,这些值不能被修改,所以请确保在运行时不修改它们。
我们不提供像SESSION_REDIS_HOST和SESSION_REDIS_PORT这样的东西,如果您想使用RedisSessionInterface,您应该将SESSION_REDIS配置为您自己的redis.Redis实例。这给了你更多的灵活性,就像你可能想使用相同的redis.Redis实例也用于缓存,那么您不需要保留两个redis.Redis实例在同一进程中。
下面的配置值是Flask本身内与会话相关的内置配置值。它们都可以被Flask-Session理解,例如,您应该使用PERMANENT_SESSION_LIFETIME来控制您的会话生存期。
SESSION_COOKIE_NAME | 会话cookie的名称 |
SESSION_COOKIE_DOMAIN | 会话cookie的域。如果没有设置此属性,则cookie对SERVER_NAME的所有子域都有效。 |
SESSION_COOKIE_PATH | 会话cookie的路径。如果没有设置此cookie,则cookie将对所有APPLICATION_ROOT有效,如果没有设置为’/’,则cookie将对所有APPLICATION_ROOT有效。 |
SESSION_COOKIE_HTTPONLY | 控制是否应该使用httponly标志设置cookie。默认值为True。 |
SESSION_COOKIE_SECURE | 控制是否应使用安全标志设置cookie。默认值为False。 |
PERMANENT_SESSION_LIFETIME | 永久会话asdatetime的生命周期。timedelta对象。从Flask0.8开始,这也可以是一个表示秒的整数。 |
一个配置键列表也可以被扩展理解:
SESSION_TYPE | 指定要使用的会话接口的类型。内置的会话类型: null: NullSessionInterface (default) redis: RedisSessionInterface memcached: MemcachedSessionInterface filesystem: FileSystemSessionInterface mongodb: MongoDBSessionInterface sqlalchemy: SqlAlchemySessionInterface |
SESSION_PERMANENT | 无论是否使用永久会话,默认为True |
SESSION_USE_SIGNER | 无论是否签署会话cookie sid,如果设置为True,就必须设置flask.Flask.secret_key,默认为False |
SESSION_KEY_PREFIX | 在所有会话键之前添加的前缀。这使得为不同的应用程序使用相同的后端存储服务器成为可能,默认为“session:” |
SESSION_REDIS | 一个redis.Redis 实例,默认连接到127.0.0.1:6379 |
SESSION_MEMCACHED | 一个memcache.Client实例, 默认连接到127.0.0.1:11211 |
SESSION_FILE_DIR | 存储会话文件的目录。默认使用当前工作目录下的flask_session目录。 |
SESSION_FILE_THRESHOLD | 会话开始删除某些项之前存储的最大项数,默认为500 |
SESSION_FILE_MODE | 会话文件需要的文件模式,默认为0600 |
SESSION_MONGODB | 一个pymongo.MongoClient 实例, 默认连接到 127.0.0.1:27017 |
SESSION_MONGODB_DB | 要使用的MongoDB数据库,默认为“flask_session” |
SESSION_MONGODB_COLLECT | 要使用的MongoDB集合,默认为“session” |
SESSION_SQLALCHEMY | 一个flask.ext.sqlalchemy.SQLAlchemy实例其数据库连接URI使用SQLALCHEMY_DATABASE_URI 参数 |
SESSION_SQLALCHEMY_TABLE | 要使用的SQL表的名称,默认为“sessions” |
基本上,您只需要配置SESSION_TYPE。
请注意:默认情况下,Flask-Session中的所有非空会话都是永久的。
内置的会话接口
NullSessionInterface
如果没有配置不同的SESSION_TYPE,则将使用它生成更好的错误消息。将允许只读访问空会话,但设置失败。
RedisSessionInterface
使用Redis键值存储作为会话后端。(redis-py需要)
相关配置值:
- SESSION_REDIS
MemcachedSessionInterface
使用Memcached作为会话后端。(需要pylibmc或memcache)
- SESSION_MEMCACHED
FileSystemSessionInterface
使用werkzeug.contrib.cache.FileSystemCache 作为会话后端。
MongoDBSessionInterface
使用 MongoDB 作为会话后端。 (pymongo需要)
- SESSION_MONGODB
- SESSION_MONGODB_DB
- SESSION_MONGODB_COLLECT
SqlAlchemySessionInterface
使用SQLAlchemy作为会话后端。(Flask-SQLAlchemy需要)
- SESSION_SQLALCHEMY
- SESSION_SQLALCHEMY_TABLE
API
class flask.ext.session.Session(app=None)¶
该类用于向一个或多个Flask应用程序添加服务器端会话。
有两种使用模式。一个是用一个非常具体的Flask应用程序初始化实例:
app = Flask(__name__) Session(app)
第二种是创建对象一次,然后配置应用程序:
sess = Session() def create_app(): app = Flask(__name__) sess.init_app(app) return app
默认情况下,Flask-Session将使用NullSessionInterface,您确实应该配置您的应用程序来使用不同的SessionInterface。
请注意:您不能直接使用Session实例,Session所做的只是更改Flask应用程序上的session_interface属性。
init_app(app)
这用于为app对象设置会话。
参数:app -配置正确的Flask app对象。
class flask.ext.session.sessions.ServerSideSession(initial=None, sid=None, permanent=None)
- 用于基于服务器端的会话的基类。
- sid
- Session id,在内部,我们使用uuid.uuid4()来生成一个会话id。 你可以用 session.sid.访问它
class flask.ext.session.NullSessionInterface
- 用来打开一个flask.sessions.NullSession实例
class flask.ext.session.RedisSessionInterface(redis, key_prefix, use_signer=False, permanent=True)
- 使用Redis键值存储作为会话后端。
- 参数:
- redis – 一个redis.Redis 实例
- key_prefix – 添加到所有Redis存储键的前缀。
- use_signer – 是否对会话id cookie签名。
- permanent – 是否使用 永久会话 。
class flask.ext.session.MemcachedSessionInterface(client, key_prefix, use_signer=False, permanent=True)
- 使用memcached作为后端的会话接口。
- 参数
- client – 一个memcache.Client 实例
- key_prefix – 添加到所有Memcached存储键的前缀。
- use_signer – 是否对会话id cookie签名 .
- permanent – 是否使用永久会话。
class flask.ext.session.FileSystemSessionInterface(cache_dir, threshold, mode, key_prefix, use_signer=False, permanent=True)
- 使用werkzeug.contrib.cache.FileSystemCache作为会话后端。
- 参数
- cache_dir – 存储会话文件的目录。
- threshold – 会话在开始删除某些项之前存储的最大项数。
- mode – 会话文件需要的文件模式,默认为0600
- key_prefix –添加到FileSystemCache存储键的前缀。
- use_signer – 是否对会话id cookie签名。
- permanent – 是否使用永久会话。
class flask.ext.session.MongoDBSessionInterface(client, db, collection, key_prefix, use_signer=False, permanent=True)
- 使用mongodb作为后端的会话接口。
- 参数
- client – 一个pymongo.MongoClient 实例
- db – 你想使用的数据库
- collection – 您要使用的集合。
- key_prefix – 添加到所有MongoDB存储键的前缀。
- use_signer – 是否对会话id cookie签名。
- permanent – 是否使用永久会话。
class flask.ext.session.SqlAlchemySessionInterface(app, db, table, key_prefix, use_signer=False, permanent=True)
- 使用flask应用程序中 Flask-SQLAlchemy 作为会话后端
- 参数
- app – 一个Flask应用程序实例
- db – 一个Flask-SQLAlchemy 实例.
- table – 你想使用的数据表名
- key_prefix – 添加到所有存储键的前缀。
- use_signer – 是否对会话id cookie签名。
- permanent – 是否使用永久会话。