内容字号:默认大号超大号

段落设置:段首缩进取消段首缩进

字体设置:切换到微软雅黑切换到宋体

flask-session

2018-01-11 16:57 出处:清屏网 人气: 评论(0

一、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

分享给小伙伴们:
本文标签: flasksession

相关文章

发表评论愿您的每句评论,都能给大家的生活添色彩,带来共鸣,带来思索,带来快乐。

CopyRight © 2015-2016 QingPingShan.com , All Rights Reserved.

清屏网 版权所有 豫ICP备15026204号