zoukankan      html  css  js  c++  java
  • flask-session

    一、session
                 session和cookie的原理和区别:
                 cookie是保存在浏览器上的键值对
                 session是存在服务端的键值对(服务端的session就是一个大字典,字典中是随机字符串)(session与request原理相同)(session原理跟上下文也有关系)
                 session依赖于cookie存在
                 session流程
                     当请求第一次进来,生成随机字符串
                      -发给用户cookie
                      -保存到session字典中时
                      它调用stark将随机字符串和对应的值放到local
                    视图函数
                     -使用时导入用top(它拿的是session)
                         session=LocalProxy(partile(_lookup_req_object,'session '))
                   请求处理完毕:
                         内存处理完毕后,将session做持久化(session存到数据库,存到Redis,存到加密的cookie中)

    二、session源码解析     

                  1.先执行Flask的__call__方法 ,调用出来wsgi_app,它先做request的上下文做完,请求刚进来到push中,它先处理request将请求相关的数据,然后添加到了local中,
                     紧接着处理session(将RequestContext对象(request,session)添加到local中),request(将request信息封装到Request(environ)对象并复制给requestContext 对                       象),然后获取cookie中的随机字符串,检验是否有,没有就生成。根据随机字符串,获取服务端session保存的值。把session放到内存中,
                     执行wsgi_app方法下面的视图函数。执行完视图函数返回到full_dispatch_requesthong ,触发只执行一次的装饰器中(触发Flask信号),
                     执行完这个装饰器,紧接着执行下面的特殊的装饰器,如果这些特殊装饰器没有返回值,那么rv=None,如果有返回值,页面时就显示这个返回值,
                     如果没有返回值,触发执行那个视图函数,拿返回值。请求执行完返回后,调用finalize_request,对它的返回值进行封装。

     如何处理的request
              ctx = self.request_context(environ)
              将request信息封装到Request(environ)对象并复制给
              requestContext 对象
          class RequestContext:
             def __init__(self, app, environ, request=None):
                   self.app = app
                   if request is None:
                   request = app.request_class(environ)
                   self.request = request
                   self.url_adapter = app.create_url_adapter(self.request)
                   self.flashes = None
                   self.session = None
    
    如何处理的session
          class RequestContext:
                 def push(self):
     将RequestContext对象(request,session)添加到local中
                       _request_ctx_stack.push(self)
    刚开始处理session
    #return app.session _interface.open_session(self,request)
    #app.session _interface=SecureCookieSessionInterface()
    
                     self.session = self.app.open_session(self.request)
                     if self.session is None:
                     self.session = self.app.make_null_session()           

    三、Flask和Django的区别  

               请求相关的数据

                    -Django:参数

                    -Flask:    基于Local,LocalStark对象

                多个请求进来会不会混淆

                      -单线程

                      -多线程

                      -协程

                        解决: from greenlet import getcurrent as get_ident

            

  • 相关阅读:
    大数据平台的数据源
    大数据平台的数据采集
    kubernetes入门
    机器学习分类算法
    唱吧DevOps的落地,微服务CI/CD的范本技术解读
    JavaEE开发之SpringBoot整合MyBatis以及Thymeleaf模板引擎
    MySQL索引及查询优化总结 专题
    玩转spring boot——ajax跨域
    Linux Shell远程执行命令(命令行与脚本方式)
    Android ServiceConnection
  • 原文地址:https://www.cnblogs.com/mengqingjian/p/8258938.html
Copyright © 2011-2022 走看看