【发布时间】:2020-03-01 00:04:28
【问题描述】:
我正在使用一个类来跨烧瓶路由共享变量。
class Manager():
def __init__(self):
self.passwords = []
def setRestock(self, password: str, copies: str):
self.passwords.append(password)
这是我班级代码的一部分。在我用几个密码设置 self.passwords 的值后,它看起来像这样:
['testpassword1', 'testpassword2', 'testpassword3']
我创建了一个返回 self.passwords 值的路由
@bp.route('/getPasswords', methods=['GET'])
def getPasswords():
return jsonify({
'status': 'ok',
'data': manager.passwords
}), 200
预期的结果应该是:
{"data":['testpassword1', 'testpassword2', 'testpassword3'],"status":"ok"}
当我向该路由发出请求时,会显示预期的结果,但在每 5-6 个请求之后,它会随机返回 {"data":[],"status":"ok"}。然后再次发出请求会返回正确的结果。
我的问题是 self.passwords 被随机返回为[],这导致 HTML 页面出现问题。为什么会发生这种情况,我该如何解决?
【问题讨论】:
-
如果您希望内容在多个 HTTP 调用中保持不变,请将其写入文件或数据库。 HTTP 调用通常是无状态的。
-
我的网站上一次会有超过 10k 人,它必须继续读取文件或数据库,如果我继续读取文件或数据库,它会占用大量资源且效率不高跨度>
-
您的路线指的是
manager.passwords,但manager是什么?它在哪里定义?此外,您真的有 10,000 人在使用您的网站,通过简单的 get 请求向他们发送所有相同的密码列表? -
请允许我详细说明:这不是它的工作原理。除非您创建持久会话,否则 HTTP 调用是无状态的。这有充分的理由。如果您希望 10k 用户看到相同的内容,将其保存在适当的持久数据存储中,即数据库,并在每次请求时从该存储中读取它。没有网络服务器可以按照您期望的方式工作。我假设您当前正在使用烧瓶开发服务器,当您开始使用像 gunicorn 这样的 WSGI 服务器在生产中运行它时,这个问题只会变得更糟。
-
@IceDude 尝试提供您正在使用的完整代码,如果您不提及与它交互的代码,则无法知道
manager.passwords发生了什么。如上所述,REST api 是无状态的,因此您明确需要存储您想要持久化的内容。此外,10k 人同时使用 Web 服务的人数并不是很多,当然取决于您的基础设施,大多数数据库系统在这种负载下工作得很好。您需要担心的是为什么要创建一个端点来获取明文密码列表?