File size: 4,577 Bytes
3a5cf48 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 | import os
from .sessions import (
FileSystemSessionInterface,
MemcachedSessionInterface,
MongoDBSessionInterface,
NullSessionInterface,
RedisSessionInterface,
SqlAlchemySessionInterface,
SqliteSessionInterface,
)
__version__ = "0.6.0"
class Session:
"""This class is used to add Server-side Session to one or more Flask
applications.
There are two usage modes. One is initialize the instance with a very
specific Flask application::
app = Flask(__name__)
Session(app)
The second possibility is to create the object once and configure the
application later::
sess = Session()
def create_app():
app = Flask(__name__)
sess.init_app(app)
return app
By default Flask-Session will use :class:`NullSessionInterface`, you
really should configurate your app to use a different SessionInterface.
.. note::
You can not use ``Session`` instance directly, what ``Session`` does
is just change the :attr:`~flask.Flask.session_interface` attribute on
your Flask applications.
"""
def __init__(self, app=None):
self.app = app
if app is not None:
self.init_app(app)
def init_app(self, app):
"""This is used to set up session for your app object.
:param app: the Flask app object with proper configuration.
"""
app.session_interface = self._get_interface(app)
def _get_interface(self, app):
config = app.config.copy()
# Flask-session specific settings
config.setdefault("SESSION_TYPE", "null")
config.setdefault("SESSION_PERMANENT", True)
config.setdefault("SESSION_USE_SIGNER", False)
config.setdefault("SESSION_KEY_PREFIX", "session:")
config.setdefault("SESSION_ID_LENGTH", 32)
# Redis settings
config.setdefault("SESSION_REDIS", None)
# Memcached settings
config.setdefault("SESSION_MEMCACHED", None)
# Filesystem settings
config.setdefault(
"SESSION_FILE_DIR", os.path.join(os.getcwd(), "flask_session")
)
config.setdefault("SESSION_FILE_THRESHOLD", 500)
config.setdefault("SESSION_FILE_MODE", 384)
# MongoDB settings
config.setdefault("SESSION_MONGODB", None)
config.setdefault("SESSION_MONGODB_DB", "flask_session")
config.setdefault("SESSION_MONGODB_COLLECT", "sessions")
# SQLAlchemy settings
config.setdefault("SESSION_SQLALCHEMY", None)
config.setdefault("SESSION_SQLALCHEMY_TABLE", "sessions")
config.setdefault("SESSION_SQLALCHEMY_SEQUENCE", None)
config.setdefault("SESSION_SQLALCHEMY_SCHEMA", None)
config.setdefault("SESSION_SQLALCHEMY_BIND_KEY", None)
common_params = {
"key_prefix": config["SESSION_KEY_PREFIX"],
"use_signer": config["SESSION_USE_SIGNER"],
"permanent": config["SESSION_PERMANENT"],
"sid_length": config["SESSION_ID_LENGTH"],
}
if config["SESSION_TYPE"] == "redis":
session_interface = RedisSessionInterface(
config["SESSION_REDIS"], **common_params
)
elif config["SESSION_TYPE"] == "memcached":
session_interface = MemcachedSessionInterface(
config["SESSION_MEMCACHED"], **common_params
)
elif config["SESSION_TYPE"] == "filesystem":
session_interface = FileSystemSessionInterface(
config["SESSION_FILE_DIR"],
config["SESSION_FILE_THRESHOLD"],
config["SESSION_FILE_MODE"],
**common_params,
)
elif config["SESSION_TYPE"] == "mongodb":
session_interface = MongoDBSessionInterface(
config["SESSION_MONGODB"],
config["SESSION_MONGODB_DB"],
config["SESSION_MONGODB_COLLECT"],
**common_params,
)
elif config["SESSION_TYPE"] == "sqlalchemy":
session_interface = SqliteSessionInterface(
app,
config["SESSION_SQLALCHEMY"],
config["SESSION_SQLALCHEMY_TABLE"],
config["SESSION_SQLALCHEMY_SEQUENCE"],
config["SESSION_SQLALCHEMY_SCHEMA"],
config["SESSION_SQLALCHEMY_BIND_KEY"],
**common_params,
)
else:
session_interface = NullSessionInterface()
return session_interface
|