• flask的session


    如何设置session

    • 需要导入session的包

    • 使用session,必须要配置密钥secret_key

    from flask import Flask,session
     
    app = Flask(__name__)
    # 要用session,必须app配置一个密钥
    app.secret_key  =  "asdasdihasdiuh"
    app.config['SESSION_COOKIE_NAME']="python13session"
     
    # app.session_interface
     
    #app.session_interface实现了两个方法,一个叫save_session,一个open_session,
     
    @app.route("/",)
    def index():
        #如何设置sessoion
        # 1 导入session
        # 2 给sessoion设置值
        session['name'] = "egon"
        session["nam1"] ="sdsd"
        return "ok"
     
    @app.route("/login")
    def login():
        print(session["name"])
        return "login"
     
    if __name__ == '__main__':
        app.run()
     
    

    session的原理

    session保存在前端的cookies中

    app.session_interface实现了两个方法,一个叫save_session,一个叫open_session。

    当响应要返回给客户端时候,会调用sesssion_ interface中的save_ session方法。 把全局session字典和secret_key加密得到va1,然后将这个va1设置到cookie中。cooki e的键为配置文件中的session_ cookie. name,值就是我们session

    当flask接收到请求的时候,会调用sesssion_ interface中的open_ sess ion方法,该方法中从cookie中取键为
    配置文件中session_ cookie_ name的cookie值, 得到这个值以后呢,做解密。然后赋值给全局的session字典。这样我们就可以取到之前flask设置session。

    class SecureCookieSessionInterface(SessionInterface):
     
        salt = "cookie-session"
     
        digest_method = staticmethod(hashlib.sha1)
     
        key_derivation = "hmac"
     
        serializer = session_json_serializer
        session_class = SecureCookieSession
     
        def get_signing_serializer(self, app):
            if not app.secret_key:
                return None
            signer_kwargs = dict(
                key_derivation=self.key_derivation, digest_method=self.digest_method
            )
            return URLSafeTimedSerializer(
                app.secret_key,
                salt=self.salt,
                serializer=self.serializer,
                signer_kwargs=signer_kwargs,
            )
        # 取session的时候执行的
        def open_session(self, app, request):
            s = self.get_signing_serializer(app)
            if s is None:
                return None
            ##cookie键是SESSION_COOKIE_NAME"=session
            val = request.cookies.get(app.session_cookie_name)
     
            print("open_session.session_cookie_name,", app.session_cookie_name, )
            if not val:
                return self.session_class()
            max_age = total_seconds(app.permanent_session_lifetime)
            try:
                data = s.loads(val, max_age=max_age)
                print("self.session_class(data)", self.session_class(data) )
                return self.session_class(data)
            except BadSignature:
                return self.session_class()
     
        #存session的时候执行的
        def save_session(self, app, session, response):
            domain = self.get_cookie_domain(app)
            path = self.get_cookie_path(app)
     
            # If the session is modified to be empty, remove the cookie.
            # If the session is empty, return without setting the cookie.
            if not session:
                if session.modified:
                    response.delete_cookie(
                        app.session_cookie_name, domain=domain, path=path
                    )
     
                return
            # Add a "Vary: Cookie" header if the session was accessed at all.
            if session.accessed:
                response.vary.add("Cookie")
     
            if not self.should_set_cookie(app, session):
                return
            httponly = self.get_cookie_httponly(app)
            secure = self.get_cookie_secure(app)
            samesite = self.get_cookie_samesite(app)
            expires = self.get_expiration_time(app, session)
            # 把session做了一个加密,把整个session的key--》val,全部加密,的到一个value值,
            #session是一个大字典,
            val = self.get_signing_serializer(app).dumps(dict(session))
            # 他把session加密后得到的val存到cookie里面了
            #cookie键是SESSION_COOKIE_NAME"=session
            print("源码中的session",dict(session))
            print("app.session_cookie_name,",app.session_cookie_name,)
            response.set_cookie(
                app.session_cookie_name,
                val,
                expires=expires,
                httponly=httponly,
                domain=domain,
                path=path,
                secure=secure,
                samesite=samesite,
            )
    

    返回前端的cookies的key是flask配置中的SESSION_COOKIE_NAME配置的名字,默认配置的是session。

    返回前端的cookies的value是后台flask把session对象secret_key加密后得到的值。

    因此,flask的session默认是通过cookies的方法实现的,那我们如何使用redis来保存session?

  • 相关阅读:
    Oracle 自定义聚合函数
    PL/SQL Developer背景色设置
    Oracle 所有关键字查询视图 V$RESERVED_WORDS
    react创建ts项目
    chrome如何导出已经安装的扩展程序为.crx文件?
    If you would prefer to ignore this check, add SKIP_PREFLIGHT_CHECK=true to an .env file in your
    vue脚手架配置环境变量
    sourceTree系列二:创建分支,并推送到远程上
    sourceTree系列一:合并分支,把uat的代码合并到dev上
    如何在typescript中解决 error TS2451: Cannot redeclare block-scoped variable 'name'
  • 原文地址:https://www.cnblogs.com/cnhyk/p/12755994.html
Copyright © 2020-2023  润新知