File size: 4,577 Bytes
17e971c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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