Python 在Flask中,会话如何传递到模板以及应用程序功能之间?

Python 在Flask中,会话如何传递到模板以及应用程序功能之间?,python,session,flask,proxy,Python,Session,Flask,Proxy,在我对Flask会话进行调查的过程中,我试图更好地理解Flask会话的工作原理 根据会话的说法,对象本身是一个 我的理解(也就是说,很可能在某种程度上是错误的,这就是这个问题所涉及的=)是什么意思: 代理会话对象从应用程序访问,用于根据需要修改读取的数据 通常,代理-会话会立即将其更改转移到代理-会话(代理-会话中的会话除外) 如果代理-会话忙(如果是多线程应用程序),代理-会话将等待代理-会话可用,然后将其更改传输到代理-会话 模板接收“原始”会话(即代理的-会话),因此没有能力/需要

在我对Flask会话进行调查的过程中,我试图更好地理解Flask会话的工作原理


根据
会话
的说法,对象本身是一个

我的理解(也就是说,很可能在某种程度上是错误的,这就是这个问题所涉及的=)是什么意思:

  • 代理
    会话
    对象从应用程序访问,用于根据需要修改读取的数据

  • 通常,代理-
    会话
    会立即将其更改转移到代理-
    会话
    (代理-
    会话
    中的会话除外)

  • 如果代理-
    会话
    忙(如果是多线程应用程序),代理-
    会话
    将等待代理-
    会话
    可用,然后将其更改传输到代理-
    会话

  • 模板接收“原始”会话(即代理的-
    会话
    ),因此没有能力/需要访问
    会话

  • 由于字典(session
    is
    是可变的,我假设它的id在session的长度内保持不变(尽管内容可以修改)

  • 实际的
    会话
    (代理对象,可通过
    会话获得。\u get\u current\u object()
    )不应更改其
    ID

  • 现在,当我试图检查我的假设时,我遇到的行为让我有点困惑

    考虑以下代码:

    my_app.py

    从烧瓶导入(
    瓶子
    渲染模板,
    一场
    )
    app=烧瓶(名称)
    app.secret\u key='一些随机密钥'
    @app.route(“/create/”)
    def create():
    会话['example']=['one','two']
    打印ID()
    返回str(会话['example'])
    @app.route(“/modify/”)
    def modify():
    会话['example'].append('three')
    打印ID()
    返回render\u template('my\u template.html',id=id)
    @app.route(“/display/”)
    def display():
    打印ID()
    返回str(会话['example'])
    def print_ids():
    进口检验
    调用_function=inspect.stack()[1][3]
    打印(“”)
    打印(调用函数+”:会话ID为:{}。格式(ID(会话)))
    打印(调用函数+”:会话['example']ID为{}。格式(ID(会话['example']))
    打印('uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu')
    打印(调用函数+“:session.\u get\u current\u object()ID为:{}”。格式(ID(session.\u get\u current\u object()))
    打印(调用函数+“:session.\u get\u current\u object()['example']ID为:{}”。格式(ID(session.\u get\u current\u object()['example']))
    
    my_template.html

    
    显示会话['example']
    {%if会话['example']%}
    {{session['example']}
    
    会话ID为:{ID(会话)}
    会话['example']ID为:{ID(会话['example'])}
    {%else%} 未设置会话['example']=( {%endif%}
    我们的想法是打印代理-
    session
    session['example']
    (这是一个列表)、代理-
    session
    (即
    session.\u get_current_object()
    )和代理-
    session['example']
    (即
    session.\u get_current_object()['example']
    )的id(session)
    id(会话['example'])
    以跟踪在何处使用的内容

    结果如下:

    ../create/
    #id(会话)4338311808
    #id(会话获取当前对象())4343709776
    #id(会话['示例])43654376
    #id(session._get_current_object()['example'])4343654376
    …/修改/
    #id(会话)4338311808
    #id(会话获取当前对象())4344315984
    #id(会话['example'])4343652720
    #id(session._get_current_object()['example'])4343652720
    呈现my_template.html
    #id(会话)4344315984
    #id(会话['example'])4343652720
    …/显示/
    #id(会话)4338311808
    #id(会话获取当前对象())4344471632
    #id(会话['示例])4341829576
    #id(session._get_current_object()['example'])4341829576
    #再来一次
    …/显示/
    #id(会话)4338311808
    #id(会话获取当前对象())4344471632
    #id(会话['example'])4344378072
    #id(session._get_current_object()['example'])4344378072
    
    我努力想了解的是:

  • 一般来说,我对这个概念有哪些误解/错误的假设

  • 为什么
    会话['example']
    会话的ID.\u get\u current\u object()['example']
    在每次点击显示时都会更改(以及每一个其他方法,但特别是显示,因为它不会修改任何内容,我希望所有ID都保持不变)

  • 为什么
    session.\u get\u current\u object()
    的id会更改,而
    session
    的id不会更改

  • 由于
    session['example']
    session.\u get\u current\u object()['example']
    的ID在任何函数的上下文中都是相同的,因此我假设如果一个对象被更改,那么这两个对象都会被更改,因为它们是相同的对象

    话虽如此,但考虑到
    会话,\u get\u current\u object()['example']
    在内部