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的上下文管理

  • 相关阅读:
    Windows环境中Java多个JDK之间相互切换
    百度地图调用,传递经纬度到后台
    富文本的使用-KindEditor
    Play框架的@OneToMany、@ManyToOne级联操作
    Play框架文件上传
    [20171211][转载]如何实现dbms_output输出没有打开serveroutput on.txt
    [20171211]ora-16014 11g.txt
    [20171206]rman与truncate2.txt
    [20171206]rman与truncate.txt
    [20171205]uniq命令的输入输出.txt
  • 原文地址:https://www.cnblogs.com/longyunfeigu/p/9466591.html
Copyright © 2011-2022 走看看