zoukankan      html  css  js  c++  java
  • flask总结之session,websocket,上下文管理

    1.关于session

      flask是带有session的,它加密后存储在用户浏览器的cookie中,可以通过app.seesion_interface源码查看

    from flask import Flask,session
    
    app = Flask(__name__)
    app.secret_key = 'aptx4869'  # 必须要指定这个参数
    
    @app.route('/login')
    def login():
        #...
        # 设置session
        session['user_info'] = 'name'
        return '123'
    
    if __name__ == '__main__':
        app.run(debug=True)
    View Code

    登录后,通过F12查看网络请求信息,可以看到一个Set-Cookie,这个cookie的key就是session,值为一堆加密字符串

    由于服务端是单进程,单线程。所有请求过来时会排队。这个字典会放一个key,这个key就是程序的线程id,value存放用户信息

    2.关于websocket

      它是一个协议,常与http对比,两者都是应用层协议。websocket主要解决了服务端向客户端推送消息(全双工)

      http协议规定:一次请求一次响应,属于无状态短链接。http协议只能被动接受客户端给服务端发送的消息

      之前该介绍链接:猛戳此处

      websocket协议规定:

        --握手:base64(sha1(key+magic key))  

        --收发数据(加密)

           -127

           -126

           <=125

          (经过以上三种字节大小判断对数据进行解密)

        --持久连接

      在三大框架中的使用:

         flask中使用了werkzurg,它支持websocket(在新版本中),但是效果不是太好,我们可以使用geventwebsocket模块实现,它既支持http也支持websocket

        django中默认socket使用的是wsgiref写的,它也不支持websocket,只支持http协议,但是我们可以使用channel组件实现

        tornado中默认使用的是自己的socket,它既支持http协议也支持websocket协议

    相关博客链接

    3.上下文管理

    flask常见第三方组件

    # Flask组件
        flask-session  session放在redis
        flask-SQLAlchemy 如django里的ORM操作
        flask-migrate  数据库迁移
        flask-script  自定义命令
        blinker  信号-触发信号
    # 第三方组件
        Wtforms 快速创建前端标签、文本校验
        dbutile     创建数据库连接池
        gevnet-websocket 实现websocket
    # 自定义Flask组件
        自定义auth认证 
        参考flask-login组件

    flask上下文管理流程:

    # a、简单来说,falsk上下文管理可以分为三个阶段:
      1、'请求进来时':将请求相关的数据放入上下文管理中
      2、'在视图函数中':要去上下文管理中取值
      3、'请求响应时':要将上下文管理中的数据清除
    # b、详细点来说:
      1、'请求刚进来':
            将request,session封装在RequestContext类中
            app,g封装在AppContext类中
            并通过LocalStack将requestcontext和appcontext放入Local类中
      2、'视图函数中':
            通过localproxy--->偏函数--->localstack--->local取值
      3、'请求响应时':
            先执行save.session()再各自执行pop(),将local中的数据清除

    主要涉及到类:

    RequestContext  #封装进来的请求(赋值给ctx)
    AppContext      #封装app_ctx
    LocalStack      #将local对象中的数据维护成一个栈(先进后出)
    Local           #保存请求上下文对象和app上下文对象

    Flask把Local对象中的的值stack 维护成一个列表原因:

    # 因为通过维护成列表,可以实现一个栈的数据结构,进栈出栈时只取一个数据,巧妙的简化了问题。
    # 还有,在多app应用时,可以实现数据隔离,列表里不会加数据,而是会生成一个新的列表
    # local是一个字典,字典里key(stack)是唯一标识,value是一个列表

    相关博客链接

      

  • 相关阅读:
    python 3.6.2 使用VScode 安装requests包
    JExcel读取Excel,完成随机数对应学号,随机选取学生姓名
    HashMap和Map的道道
    腾讯云主机windows 2012 r2搭建ftp服务器
    关于网站域名访问出现welcome to nginx 的问题
    腾讯云主机windows 2012 r2标准版&&搭建java环境(jdk+tomcat)
    Anaconda 安装+使用+换源+更新
    已知三点求平面方程、平面法向量和点到平面的距离
    Open Cascade:计算体积
    VS2015安装QT插件
  • 原文地址:https://www.cnblogs.com/LearningOnline/p/9759337.html
Copyright © 2011-2022 走看看