烧瓶-每个HTTP请求似乎都不是一个新的独立请求。这是为什么?

时间:2019-02-16 11:18:43

标签: python flask

我有一个简单的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)

当我在浏览器中查看该端点时,它在第一次请求时显示“语言= Python”(预期)。如果我重新加载页面,它将显示“语言= Java”(意外)。如果我再次重新加载,它会显示“语言= C ++”。

以我理解HTTP的方式,每个请求都是对服务器的新请求,因此,我希望浏览器每次重新加载页面时都显示“ Language = Python”。

这是怎么回事?
为什么Flask端点似乎还记得上一个请求中“语言”列表的状态?
我希望它没有那样做!谢谢。

2 个答案:

答案 0 :(得分:0)

pop()是Python中的内置函数,可从列表或给定的索引值中删除并返回最后一个值。
“语言”是烧瓶应用程序中的列表,当您调用pop时,将删除索引0处的元素。这就是为什么下一次执行HTTP调用时会得到下一个元素的原因。 “语言”列表是Flask模块的“ 状态”。下面的代码将始终返回“ Python”。

lang = languages[0]

答案 1 :(得分:0)

通常不会在每次请求时每次都加载Python。考虑到这一点,请注意如何在全局范围中声明languages列表。这意味着每个请求将共享相同的实例。由于列表是可变的(与元组不同),所以除非您有意这样做,否则这是灾难的秘诀。

尽管有用例,例如每个请求都访问相同的数据库连接(如果连接是线程安全的)。

基本上,您必须了解请求范围内正在“出生”的内容,以及属于全局范围并在请求之间共享的内容。