Почему id объекта, возвращаемого session._get_current_object (), изменяется при каждом запросе, а id сессии остается неизменным? - PullRequest
0 голосов
/ 19 апреля 2019

Я использую:

  • 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() меняется.

1 Ответ

2 голосов
/ 19 апреля 2019

session - это объект, который вы импортировали из модуля flask. Вы импортируете его только один раз, и он не изменится, как и его id(). Он разделяется между потоками и является прокси для базовых объектов.

Каждый запрос может выполняться в другом потоке, и у каждого будет свой базовый объект, поэтому они могут иметь разные id() s.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...