首页 > 解决方案 > Flask - 每个 HTTP 请求似乎都不是一个新的独立请求。这是为什么?

问题描述

我设置了一个简单的 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”(预期)。如果我重新加载页面,它会显示“Language = Java”(意外)。如果我再次重新加载,它会显示“语言 = C++”。

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

这里发生了什么?
为什么 Flask 端点似乎记得上一个请求中“语言”列表的状态?
我宁愿它没有那样做!谢谢。

标签: pythonflask

解决方案


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

虽然它有一些用例,例如每个请求都访问同一个数据库连接(如果连接是线程安全的)。

基本上,您必须知道在请求范围内“诞生”了什么,以及属于全局范围并在请求之间共享的内容。


推荐阅读