首页 > 解决方案 > 如何摆脱烧瓶服务器代码中的全局变量?

问题描述

在编写烧瓶服务器时,我发现自己处于与此类似的情况:

from flask import Flask, jsonify

app = Flask(__name__)
x = 0

@app.route('/method_a', methods=['GET'])
def method_a():
    global x
    x = x + 1
    return jsonify({'mesaage': 'value of x incremented by 1 is: '+str(x)}), 200

@app.route('/method_b', methods=['GET'])
def method_b():
    global x
    x = x + 2
    return jsonify({'message': 'value of x increased by 2 is: '+str(x)}), 200

在这里,我尝试通过来自客户端的 GET 请求调用两种方法。因此,当单个客户端向“/method_b”发出 2 个请求时,输出应该是 4,依此类推。现在我的问题是,当服务器在真实网络中运行时,多个客户端会尝试调用它的方法。所以如果第一个客户端调用'/method_a'一次,他得到输出1,同时其他客户端也会调用方法,从而改变x的值。因此,当第一个客户端在“/method_a”上发出第二个请求时,它不会得到输出为 2。
但是我想创建一个服务器,它将变量值视为不同客户端的不同值,并仅向它们显示变量值的版本。我正在使用全局变量,因为这两种方法都需要此变量才能起作用,并且由于它们是由 GET 请求调用的,因此我无法通过客户端传递变量的值。如何解决这个问题?有没有更好的方法来编写这段代码来解决上述问题?

标签: pythonflaskglobal-variables

解决方案


如果我理解正确,您可以使用 cookie 实现此目的。更改视图函数的代码以设置 cookie作为响应:

@app.route('/method_a', methods=['GET'])
def method_a():
    x = request.cookies.get('xcookie', 0)
    x = x + 1
    response = jsonify({'mesaage': 'value of x incremented by 1 is: '+str(x)})
    response.set_cookie('xcookie', x)
    return response

推荐阅读