【问题标题】:Flask - each HTTP request does not seem to be a new and independent request. Why is that?Flask - 每个 HTTP 请求似乎都不是一个新的独立请求。这是为什么?
【发布时间】:2019-02-17 00:41:59
【问题描述】:

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

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

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

【问题讨论】:

  • languages移动到index()内。
  • 以上只是我的代码的精简版本来说明问题。我需要访问其他功能中的“语言”列表。如果我将它移动到索引中,我将无法做到这一点,对吗?
  • 您可以创建一个类来保存languages 并将相关函数分组到该类中。然后在index() 中创建该类的对象并使用它。

标签: python flask


【解决方案1】:

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

lang = languages[0]

【讨论】:

  • 谢谢,但这并不能真正解决我的问题/问题。我知道 pop() 是如何工作的。我的问题是,为什么每个新的 HTTP 请求似乎都记得以前的请求。我没有设置任何东西让它记住以前的状态。我希望有更深入 Flask 知识的人能启发我并解释 1)为什么会发生这种情况,以及 2)我如何防止每个新请求“记住”以前的请求。
  • 加载代码后,会填充“语言”列表并保留在内存中。所以它不是关于更深入的 Flask 理解。它是关于理解模块加载时发生的事情。我希望现在更清楚了。
  • 真的不太清楚。你只是在断言它是那样的。但正如我所提到的,我认为默认情况下 HTTP 请求不记得状态,所以我会想象每个新请求都会看到原始的“语言”列表。您能否指出文档中解释您所指内容的内容?
  • 让我再试一次。想象一下,您有一个由数据库支持的 Flask 应用程序。在此数据库中,您有一个名为“语言”的表。每次客户端对/执行 HTTP GET 时,都会从表中获取一条记录并删除。所以在这个例子中,“状态”保存在数据库中。在您的示例中,“状态”保存在列表中。
  • 不知道为什么你认为这会有所启发——当然数据库会保留状态。我也会再试一次:在 Flask 文档中的哪个位置声明您设置的任何变量都将在 HTTP 请求中被记住?它在哪里声明其他请求将了解以前的请求(与关于 HTTP 的常识相反)?我并不是说事实并非如此,我只是在问 Flask 文档在哪里指出了这一点,因为阅读它会有所帮助。因为它的行为对于日常 HTTP 理解是异常的。
【解决方案2】:

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

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

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

【讨论】:

  • "注意你的语言列表是如何在全局范围内声明的。这意味着每个请求都将共享同一个实例。"为什么?全局范围如何暗示每个新请求都知道全局范围内的变量(之前的更改)?
猜你喜欢
  • 2015-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 1970-01-01
  • 1970-01-01
  • 2020-05-05
相关资源
最近更新 更多