如何摆脱烧瓶服务器代码中的全局变量?

时间:2019-03-22 11:29:36

标签: python flask global-variables

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

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请求调用的,因此我无法通过客户端传递变量的值。如何解决这个问题?有没有更好的方法来编写此代码来解决上述问题?

1 个答案:

答案 0 :(得分:0)

如果我正确理解,则可以使用Cookie来实现。作为响应,将视图函数的代码更改为set the cookie

var saveRequested = false;

function render() {
    renderer.render(scene, camera);

    // FIX: scene is rendered, ready to save it
    if (saveRequested) {
        saveAsImage2();
        saveRequested = false;
    }
}

function saveAsImage() {
    // say, need to take a snapshot after next frame is rendered
    saveRequested = true;
}

function saveAsImage2() {
    var imgData, imgNode;

    try {
        var strMime = "image/jpeg";
        var strDownloadMime = "image/octet-stream";

        let imgData = renderer.domElement.toDataURL(strMime);
        console.log(imgData);

        saveFile(imgData.replace(strMime, strDownloadMime), "test.jpg");

    } catch (e) {
        console.log(e);
        return;
    }
}