flask-session

栏目: Python · 发布时间: 7年前

内容简介: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信息封装到Requestenviron)对象并复制给
          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对象(requestsession)添加到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


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Java Concurrency in Practice

Java Concurrency in Practice

Brian Goetz、Tim Peierls、Joshua Bloch、Joseph Bowbeer、David Holmes、Doug Lea / Addison-Wesley Professional / 2006-5-19 / USD 59.99

This book covers: Basic concepts of concurrency and thread safety Techniques for building and composing thread-safe classes Using the concurrency building blocks in java.util.concurrent Pe......一起来看看 《Java Concurrency in Practice》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

随机密码生成器
随机密码生成器

多种字符组合密码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具