zoukankan      html  css  js  c++  java
  • Flask 的 session

    Flask 的 session

    @app.route("/", )
    def index():
        # 如何设置sessoion
        # 1 导入session
        # 2 给sessoion设置值
        # 设置 session
        session['name'] = "santa"
        session["nam1"] = "kai"
        return "ok"
    
    
    @app.route("/login/")
    def login():
        # 获取 session
        # name = session.get('name')
        print(session["name"])  # santa
        return "login"
    
    
    if __name__ == '__main__':
        app.run()
    
    

    分析 session 的原理

    全局导入session,把session,当字典存值,取就当字典取值

    原理之存session

    当响应要返回给客户端时候,会调用 sesssion_interface 中的 save_session 法。把全局session字典做加密得到 val , 然后将这个 val 设置到 cookie 中。

    cookie 的键为配置文件中的 session_cookie_name , 值就是我们session字典加密得到的结果

    原理之取 session

    当flask接收到请求的时候,会调用 sesssion_interface 中的 open_session 方法,该方法中从 cookie中取键为配置文件中 session_cookie_name 的 cookie 值,得到这个值以后呢,做解密。

    然后赋值给全局的 session 字典。这样我们就可以取到之前 flask 设置 session

    注意:用 session 必须配置 app.secret_key="随便"

    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,
            )
    

  • 相关阅读:
    Atitit.Java exe bat  作为windows系统服务程序运行
    Atitit. Object-c语言 的新的特性  attilax总结
    Atitit. Object-c语言 的新的特性  attilax总结
    Atitit。Time base gc 垃圾 资源 收集的原理与设计
    Atitit。Time base gc 垃圾 资源 收集的原理与设计
    Atitit.go语言golang语言的新的特性  attilax总结
    Atitit.go语言golang语言的新的特性  attilax总结
    Atitit.pdf 预览 转换html attilax总结
    Atitit.pdf 预览 转换html attilax总结
    Atitit.office word  excel  ppt pdf 的web在线预览方案与html转换方案 attilax 总结
  • 原文地址:https://www.cnblogs.com/kai-/p/12521132.html
Copyright © 2011-2022 走看看