zoukankan      html  css  js  c++  java
  • flask的session源码流程和第三方组件

    flask的session源码

    至于为什么使用session一定需要加上 app.secret_key?看源码

    session在没值的情况下使用会报错

    使用第三方插件

    通过上面的源码就可以看出,使用第三方flask-session插件,本质上就是替换app的session_interface接口对象,而这个接口对象必须实现两个最基本的方法:open_session和save_session方法
    安装: pip3 install flask_session

    两种使用方式:

    from redis import Redis
    from flask_session import RedisSessionInterface
    r_conn = Redis(host='localhost', port=6379, password='123456')
    app.session_interface = RedisSessionInterface(redis=r_conn, key_prefix='xxx')
    
    from flask_session import Session
    from redis import Redis
    r_conn = Redis(host='localhost', port=6379, password='123456')
    app.config['SESSION_TYPE'] = 'redis'  # session类型为redis
    app.config['SESSION_PERMANENT'] = False  # 如果设置为True,则关闭浏览器session就失效。
    app.config['SESSION_USE_SIGNER'] = False  # 是否对发送到浏览器上session的cookie值进行加密
    app.config['SESSION_KEY_PREFIX'] = 'session:'  # 保存到session中的值的前缀
    app.config['SESSION_REDIS'] = r_conn
    Session(app)
    

    第二种方式是经常使用的,而且Session(app)这种格式的形式使用第三方插件的形式和常用,本质上大多数就是对app进行处理。
    简单看一下RedisSession的源码流程


    其中的signer = self._get_signer(app)有别于内部使用的hashlib.sha1,这里使用的hmac

    总结

    flask的session说白了,其实请求到来然后在视图函数去使用的时候,把一个经过加密等出处理的字符串还原成字典,然后在视图中对这个字典进行操作,请求结束的时候,在把这个字典经过加密等处理弄成一个看不懂的字符串,然后循环上述过程。这里还有一个问题没有提到,那就算我们在视图函数里使用的session变量,是怎么对应到app.open_session拿到的结果的,其实app.open_session是作为ctx的session属性存放着的,至于这里的ctx是什么对象,就需要说到Flask的上下文管理

  • 相关阅读:
    SpringIOC的小例子
    java中递归实现复制多级文件夹
    快速排序和几种简单排序
    Oracle面试的基本题
    多态的两个小例子
    单例模式
    内部类与匿名内部类
    C#
    C#
    C#
  • 原文地址:https://www.cnblogs.com/longyunfeigu/p/9466591.html
Copyright © 2011-2022 走看看