为什么每次会话都更改session._get_current_object()返回的对象ID,而Session ID保持不变?

时间:2019-04-19 07:09:06

标签: python python-3.x session flask request

我正在使用:

  • Python 3.6.1
  • 瓶0.12.2

Flask文档的

Section on session说:

  

这是代理。

section on proxies详细说明:

  

Flask提供的某些对象是其他对象的代理。   其背后的原因是这些代理之间共享   线程,它们必须分派到绑定到   必要时在后台穿线。
...
  如果您需要访问   到代理的基础对象,您可以使用   _get_current_object()方法

这一切非常简单。
但是当我尝试以下操作时:

from flask import (
Flask,
session,
)

app = Flask(__name__)
app.secret_key = 'some random secret key'

@app.route('/')
def index():
    print("session ID is: {}".format(id(session)))
    print("session._get_current_object() ID is: {}".format(id(session._get_current_object())))
    print('________________________________')

    return 'Check the console! ;-)'

每次我向/发出请求时-id(session._get_current_object())的值是不同的,而id(session)则保持不变。

在上面引用的Flask documentation之后,应该相反。那为什么会这样呢?


更新
brunns在对his answer的评论中的建议的启发,每个线程有一个基础对象

下面是一些代码,用于测试每个线程有一个基础session对象(session._get_current_object())的假设:

import threading

from flask import (
Flask,
session,
)

app = Flask(__name__)
app.secret_key = 'some random secret key'

@app.route('/')
def index():
    print("session ID is: {}".format(id(session)))
    print("session._get_current_object() ID is: {}".format(id(session._get_current_object())))
    print("threading.current_thread().ident is: {}".format(threading.current_thread().ident))
    print('________________________________')
    return 'Check the console! ;-)'

尽管有期望,threading.current_thread().ident)从未改变,而id(session._get_current_object()却在改变。

1 个答案:

答案 0 :(得分:2)

session是您从flask模块中导入的对象。您只需导入一次,它就不会更改,它的id()也不会更改。它在线程之间共享,并且是基础对象的代理。

每个请求都可以在不同的线程上运行,并且每个请求都有一个不同的基础对象,因此它们可能具有不同的id()