资讯专栏INFORMATION COLUMN

深入理解flask框架(4):session

PingCAP / 2238人阅读

摘要:中的实现是基于。打开源码的文件,我们可以看到最后的接口类中,主要有两个函数。这个系列就此完结。

flask中session的实现是基于cookie。
打开flask源码的session.py文件,我们可以看到最后的接口类中,主要有open_session,save_session两个函数。

class SecureCookieSessionInterface(SessionInterface):
.....
    def open_session(self, app, request):
        s = self.get_signing_serializer(app)
        if s is None:
            return None
        val = request.cookies.get(app.session_cookie_name)
        if not val:
            return self.session_class()
        max_age = total_seconds(app.permanent_session_lifetime)
        try:
            data = s.loads(val, max_age=max_age)
            return self.session_class(data)
        except BadSignature:
            return self.session_class()

    def save_session(self, app, session, response):
        domain = self.get_cookie_domain(app)
        path = self.get_cookie_path(app)

        # If the session is modified to be empty, remove the cookie.
        # If the session is empty, return without setting the cookie.
        if not session:
            if session.modified:
                response.delete_cookie(
                    app.session_cookie_name,
                    domain=domain,
                    path=path
                )

            return

        # Add a "Vary: Cookie" header if the session was accessed at all.
        if session.accessed:
            response.vary.add("Cookie")

        if not self.should_set_cookie(app, session):
            return

        httponly = self.get_cookie_httponly(app)
        secure = self.get_cookie_secure(app)
        expires = self.get_expiration_time(app, session)
        val = self.get_signing_serializer(app).dumps(dict(session))
        response.set_cookie(
            app.session_cookie_name,
            val,
            expires=expires,
            httponly=httponly,
            domain=domain,
            path=path,
            secure=secure
        )

Flask类中对session的接口进行了初始化,并在process_response函数中进行了调用,但是只有save_session接口,那么open_session接口在哪里被调用呢?

session_interface = SecureCookieSessionInterface()

def process_response(self, response):
.....
        if not self.session_interface.is_null_session(ctx.session):
            self.session_interface.save_session(self, ctx.session, response)
.....    

答案就是在request上下文进栈的时候会进行调用

class RequestContext(object):
…
self.session = None
…
 def push(self):
 ....
      if self.session is None:
            session_interface = self.app.session_interface
            self.session = session_interface.open_session(
                self.app, self.request
            )

            if self.session is None:
                self.session = session_interface.make_null_session(self.app)

这样我们可以梳理一下flask中session产生的整个过程。
当调用的wsgi函数执行到push时,

        ctx = self.request_context(environ)
        error = None
        try:
            try:
                ctx.push()

push函数判断self.session是否为None,如果为None,则调用open_session进行初始化,这个过程等价于

self.session = self.session_class()

而session_class在SecureCookieSessionInterface中定义为

session_class = SecureCookieSession

而SecureCookieSession则是一个自定义的类实现了类似字典的接口,则此时可以理解为self.session = {},
之后在finalize_request函数中调用

response = self.process_response(response)
接下来
|
|
|
self.session_interface.save_session(self, ctx.session, response)
接下来
|
|
|
调用set_cookie对cookie进行设置
        response.set_cookie(
            app.session_cookie_name,
            val,
            expires=expires,
            httponly=httponly,
            domain=domain,
            path=path,
            secure=secure
        )

之后不会在写了,blueprint类与第一章类似,而模板与信号部分因为当前的前后端分离的趋势,以后用的应该越来越少。
这个系列就此完结。
以上。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41242.html

相关文章

  • 深入理解flask框架(3):config与extension

    摘要:中的配置,都是通过来控制那么究竟是什么再来看函数而是什么再转向看的源码,可以看到类继承于字典也就是说的就是一个特殊的字典,用于保存配置项。 config flask中的配置,都是通过config来控制那么config究竟是什么? self.config = self.make_config(instance_relative_config) 再来看make_config函数: def ...

    wmui 评论0 收藏0
  • 深入理解flask框架(1):WSGI与路由

    摘要:是一个小而美的微框架,主要依赖于和,只建立和的桥梁,前者实现一个合适的应用,后者处理模板。本文主要分析了是在基础上如何构建接口与路由系统的。网关协议的本质是为了解耦,实现服务器和应用程序的分离,就是一个支持的服务器与应用程序之间的约定。 flask是一个小而美的微框架,主要依赖于Werkezug 和 Jinja2, Flask 只建立 Werkezug 和 Jinja2 的桥梁,前者实...

    xiaolinbang 评论0 收藏0
  • 深入理解flask框架(2):应用上下文与请求上下文

    摘要:实现一个进程中拥有多个应用上下文机制依赖的数据结构上下文机制的实现基于的。 什么是上下文? flask框架中的上下文本质上就是两个类,我们可以先看一下他的初始化函数:应用上下文 class AppContext(object): The application context binds an application object implicitly to the c...

    wushuiyong 评论0 收藏0
  • 深入 Flask 源码理解 Context

    摘要:主要的作用是将维护的字典中键为对应的值定义为。如果没有,则会将当前到中,同时将加入列表中否则添加。注意清理之后的动作。上述代码涉及到,它强调必须是一个可调用对象。后期的工作之一是了解。这仅仅是我的个人理解。实际上这是解决多个实例运行的问题。 Flask 中的上下文对象 知乎问题 编程中什么是「Context(上下文)」 已经能够简单地说明什么是 Context,它是一个程序需要的外部对...

    ninefive 评论0 收藏0
  • flask文档学习笔记1-快速入门

    摘要:示例如下静态路由使用动态变量的路由未指定变量类型使用动态变量的路由指定变量类型指定的路由变量,可以作为被装饰的函数参数传入进来。 开始决定认真的在网上写一些东西,主要原因还是在于希望能提升学习效果。虽说python写了有几年,但是web后端框架的确没怎么接触过,买了本狗书寥寥草草的过了一遍,发现很多东西还是理解不深,真的是好记性不如烂笔头,知识也要从基础开始,退回来好好看看官方文档,再...

    lingdududu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<