flask-session

1、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中)数据库

 

2、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,对它的返回值进行封装。cookie

 如何处理的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() 

3、Flask和Django的区别  session

           请求相关的数据多线程

                -Django:参数app

                -Flask:    基于Local,LocalStark对象ide

            多个请求进来会不会混淆函数

                  -单线程加密

                  -多线程url

                  -协程

                    解决: from greenlet import getcurrent as get_ident

相关文章
相关标签/搜索