Flask - каждый HTTP-запрос не является новым и независимым запросом.Это почему? - PullRequest
0 голосов
/ 16 февраля 2019

У меня установлена ​​простая конечная точка Flask, например:

from flask import Flask

app = Flask(__name__)

languages = ['Python', 'Java', 'C++', 'Ruby', 'C']

@app.route('/')
def index():
    lang = languages.pop(0)
    return 'Language = {}'.format(lang)

Когда я смотрю на эту конечную точку в браузере, она отображает «Language = Python» при первом запросе (ожидается).Если я перезагружаю страницу, она отображает «Язык = Java» (неожиданно).Если я перезагружаюсь снова, он отображает «Language = C ++».

То, как я понял HTTP, каждый запрос - это новый и свежий запрос к серверу, поэтому я ожидал, что браузер отобразит «Language = Python».каждый раз, когда я перезагружал страницу.

Что здесь происходит?
Почему конечная точка Flask, похоже, запоминает состояние списка «языков» из предыдущего запроса?
Я бы предпочел, чтобы он этого не делал!Благодаря.

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Python обычно не загружается каждый раз при каждом запросе.Имея это в виду, обратите внимание, как ваш список languages объявлен в глобальной области видимости.Это означает, что каждый запрос будет использовать один и тот же экземпляр.Так как списки изменяемые (в отличие от кортежей), это рецепт катастрофы, если вы не делаете это специально.

Хотя есть варианты использования, как и каждый запрос, обращающийся к одному и тому жеНапример, соединение с базой данных (если соединение является поточно-ориентированным).

По сути, вы должны знать, что «рождается» внутри области запроса, что относится к глобальной области и распределяется между запросами.

0 голосов
/ 16 февраля 2019

pop () - это встроенная функция в Python, которая удаляет и возвращает последнее значение из списка или заданное значение индекса.
'languages' - это список в вашем приложении фляги, и когда вы вызываете pop элемент с индексом 0устранен.Вот почему в следующий раз, когда вы делаете HTTP-вызов, вы получаете следующий элемент.Список языков - это состояние вашего модуля Flask.Код ниже всегда будет возвращать 'Python'.

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