Я использую:
- Python 3.6.1
- Колба 0.12.2
Раздел на session
документации Flask гласит:
Это прокси.
и раздел о прокси уточняет, что:
Некоторые объекты, предоставляемые 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 , приведенной выше, все должно быть наоборот.Так почему же это происходит?
ОБНОВЛЕНИЕ вдохновленный предложением brunns в комментариях к его ответа , что в каждом потоке есть один базовый объект
Вот некоторый код,чтобы проверить предположение, что в каждом потоке есть один базовый 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()
меняется.