【问题标题】:Class Variable Returning Incorrectly?类变量返回不正确?
【发布时间】: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 服务的人数并不是很多,当然取决于您的基础设施,大多数数据库系统在这种负载下工作得很好。您需要担心的是为什么要创建一个端点来获取明文密码列表?

标签: python class flask


【解决方案1】:

使用全局变量来保存状态只能在狭窄的情况下工作。

flask 开发服务器喜欢在检测到更改时自行重启,这可能是您偶尔看到的[]。您可以尝试使用--no-reload 运行以禁用该行为。

如果您正在制作原型并希望自动重新加载,那么请尝试将数据保存在您按需读取(和写入)的文件中,而不是使用全局文件。如果您担心性能,请尝试一下。您可能会感到惊喜。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-24
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    相关资源
    最近更新 更多