Flask組件之Flask-session

一、Flask模塊中session與Flask-session組件中session的繼承關係:

  Flask模塊sessions.py:redis

class SessionInterface(object):
    def open_session(self, app, request):
        raise NotImplementedError()

    def save_session(self, app, session, response):
        raise NotImplementedError()

class SecureCookieSessionInterface(SessionInterface):
    def open_session(self, app, request):
        pass

    def save_session(self, app, session, response):
        pass

  flask-session組件sessions.py:sql

class SessionInterface(FlaskSessionInterface):
    pass

class NullSessionInterface(SessionInterface):
    pass
    
class RedisSessionInterface(SessionInterface):
    pass
    
class MemcachedSessionInterface(SessionInterface):
    pass
    
class FileSystemSessionInterface(SessionInterface):
    pass
    
class MongoDBSessionInterface(SessionInterface):
    pass
    
class SqlAlchemySessionInterface(SessionInterface):
    pass

二、Flask-session在Flask項目中的使用

2.一、從Flask-session導入Session

flask_session import Session

2.二、配置參數

app.config['SESSION_TYPE'] = 'redis'
# app.config['SESSION_TYPE'] = 'filesystem'
app.config['SESSION_REDIS'] = redis.Redis(host='140.143.227.206',port=6379,password='1234')

2.三、實例化Session

Session(app)

  實例化Session,根據配置的SESSION_TYPE類型實例化不一樣類型的SessionInterface,並將結果賦值給app.session_interface。mongodb

  Session類源碼:數據庫

class Session(object):
    """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()
        # 若是SESSION_TYPE爲空,設置SESSION_TYPE爲空
        config.setdefault('SESSION_TYPE', 'null')
        # 若是SESSION_PERMANENT爲空,設置爲永久的
        config.setdefault('SESSION_PERMANENT', True)
        config.setdefault('SESSION_USE_SIGNER', False)
        # 若是SESSION_KEY_PREFIX爲空,設置爲key的前綴爲session:
        config.setdefault('SESSION_KEY_PREFIX', 'session:')
        # 若是SESSION_REDIS爲空,設置redis的鏈接爲None
        config.setdefault('SESSION_REDIS', None)
        # 若是SESSION_MEMCACHED爲空,設置memcached的鏈接爲None
        config.setdefault('SESSION_MEMCACHED', None)
        # 若是SESSION_FILE_DIR爲空,設置session的存儲目錄爲當前目錄flask_session文件夾
        config.setdefault('SESSION_FILE_DIR',
                          os.path.join(os.getcwd(), 'flask_session'))
        # 若是SESSION_FILE_THRESHOLD爲空,設置文件閾值爲500
        config.setdefault('SESSION_FILE_THRESHOLD', 500)
        # 若是SESSION_FILE_MODE爲空,設置文件模式爲384
        config.setdefault('SESSION_FILE_MODE', 384)
        # 若是SESSION_MONGODB爲空,設置mongodb的鏈接爲None
        config.setdefault('SESSION_MONGODB', None)
        # 若是SESSION_MONGODB_DB爲空,設置存儲session的mongodb數據庫爲flask_session
        config.setdefault('SESSION_MONGODB_DB', 'flask_session')
        # 若是SESSION_MONGODB_COLLECT爲空,設置存儲session的mongodb的表名爲sessions
        config.setdefault('SESSION_MONGODB_COLLECT', 'sessions')
        # 若是SESSION_SQLALCHEMY爲空,設置SQLALCHEMY的鏈接爲None
        config.setdefault('SESSION_SQLALCHEMY', None)
        # 若是SESSION_SQLALCHEMY_TABLE爲空,設置SQLALCHEMY的表名爲sessions
        config.setdefault('SESSION_SQLALCHEMY_TABLE', 'sessions')

        # session存儲在redis
        if config['SESSION_TYPE'] == 'redis':
            # 實例化redis session接口
            session_interface = RedisSessionInterface(
                config['SESSION_REDIS'], config['SESSION_KEY_PREFIX'],
                config['SESSION_USE_SIGNER'], config['SESSION_PERMANENT'])
        # session存儲在memcached
        elif config['SESSION_TYPE'] == 'memcached':
            session_interface = MemcachedSessionInterface(
                config['SESSION_MEMCACHED'], config['SESSION_KEY_PREFIX'],
                config['SESSION_USE_SIGNER'], config['SESSION_PERMANENT'])
        # session存儲在filesystem
        elif config['SESSION_TYPE'] == 'filesystem':
            session_interface = FileSystemSessionInterface(
                config['SESSION_FILE_DIR'], config['SESSION_FILE_THRESHOLD'],
                config['SESSION_FILE_MODE'], config['SESSION_KEY_PREFIX'],
                config['SESSION_USE_SIGNER'], config['SESSION_PERMANENT'])
        # session存儲在mongodb
        elif config['SESSION_TYPE'] == 'mongodb':
            session_interface = MongoDBSessionInterface(
                config['SESSION_MONGODB'], config['SESSION_MONGODB_DB'],
                config['SESSION_MONGODB_COLLECT'],
                config['SESSION_KEY_PREFIX'], config['SESSION_USE_SIGNER'],
                config['SESSION_PERMANENT'])
        # session存儲在sqlalchemy
        elif config['SESSION_TYPE'] == 'sqlalchemy':
            session_interface = SqlAlchemySessionInterface(
                app, config['SESSION_SQLALCHEMY'],
                config['SESSION_SQLALCHEMY_TABLE'],
                config['SESSION_KEY_PREFIX'], config['SESSION_USE_SIGNER'],
                config['SESSION_PERMANENT'])
        # 不使用session
        else:
            session_interface = NullSessionInterface()

        return session_interface
View Code

2.四、Flask-session支持的session存儲方式

存儲方式 session操做接口類 
redis  RedisSessionInterface
memcached  MemcachedSessionInterface
filesystem  FileSystemSessionInterface
mongodb  MongoDBSessionInterface
sqlalchemy  SqlAlchemySessionInterface
相關文章
相關標籤/搜索