python - 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 端点似乎记得上一个请求中“语言”列表的状态?
我宁愿它没有那样做!谢谢。
解决方案
Python 通常不会在每次请求时都加载。考虑到这一点,请注意您的languages
列表是如何在全局范围内声明的。这意味着每个请求都将共享同一个实例。由于列表是可变的(与元组不同),因此这是灾难的根源,除非您是故意这样做的。
虽然它有一些用例,例如每个请求都访问同一个数据库连接(如果连接是线程安全的)。
基本上,您必须知道在请求范围内“诞生”了什么,以及属于全局范围并在请求之间共享的内容。
推荐阅读
- python - Python ~ 用字符串列表项替换字符串中的字符
- python - 如何使用给定的数学表达式在 python 中找到 x 和 y 的值?
- android - 将 JSON 数据从 Android 发送到 PHP 脚本
- node.js - AWS API Gateway Websocket - Chrome:WebSocket 握手期间出错:发送非空“Sec-WebSocket-Protocol”标头但未收到响应
- ios - 通过更新中心约束使用 pangesture 移动视图的中心
- spring - Spring boot 中的 CORS 设置不起作用
- php - 每个页面都有不同的元标记
- python - 为 python 程序设置特定命令
- perl - 如何删除以斜杠开头的部分字符串
- node.js - 带有 url 数组的 Elasticsearch 术语