烧瓶不稳定:请求返回错误值

时间:2018-12-02 13:59:55

标签: python flask flask-restful

对于家里的一个小项目,我尝试设置一个简单的RESTful服务器。我正为一个问题而苦苦挣扎,服务器返回的值是我不希望的。

这是描述我的问题的抽象示例:

# coding: utf-8
import platform as p

from flask import Flask, request
from flask_restful import Resource, Api
from flask_cors import CORS

app = Flask(__name__)
CORS(app)
api = Api(app)

hosts = {"keyA": ["Altair", "Deneb"], "keyB": ["RB3"]}

def in_host_list(hostname, key="keyA"):
    t_hosts = hosts["keyA"]
    if (key == "keyB"):
        t_hosts += hosts["keyB"]
    return hostname in t_hosts

class MainHosts(Resource):
    def get(self):
        return {p.node(): in_host_list(p.node(), "keyA")}

class AllHosts(Resource):
    def get(self):
        return {p.node(): in_host_list(p.node(), "keyB")}

api.add_resource(MainHosts, '/mainhosts')
api.add_resource(AllHosts, '/allhosts')

if __name__ == "__main__":
    app.run(host='0.0.0.0', port='5002', threaded=True)

我的问题是以下问题。假设我已经启动了python脚本,但是还没有请求。我的第一个请求看起来像这样

curl http://rb3:5002/mainhosts
{"RB3": false}

响应是我所期望的。下一个请求是下一个请求。

curl http://rb3:5002/allhosts
{"RB3": true}

这也是预期的。但是当我尝试以下操作时,我得到了一个奇怪的答复。

curl http://rb3:5002/mainhosts
{"RB3": true}

我希望得到与我的第一个电话({"RB3": false})相同的响应。即使我切换计算机并提出新的要求,我也会得到相同的结果。因此,我假设那个烧瓶以某种方式存储了某种状态?重新启动python脚本后,此行为只会更改。然后,第一个电话是正确的,但随后的所有请求都会给我比我期望的另一个响应。

我在做什么错?首先,我认为我正在访问Cookie或会话。但是,当我切换到另一台计算机并尝试访问API时,也会显示错误的数据。我已经阅读了flask和flask-restful的文档。我还阅读了有关应用程序上下文和请求上下文的信息,但是我缺少了一些东西。也许有人可以给我有用的提示。

1 个答案:

答案 0 :(得分:0)

您更改了KeyA列表,并向其添加了KeyB列表:

t_hosts = hosts["keyA"]
if (key == "keyB"):
    t_hosts += hosts["keyB"]

这更改了列表就地+=扩充分配不仅仅是创建新列表对象的简单连接。您可以先创建列表的副本,或通过串联创建新列表。

要创建副本,请在list()上调用hosts["keyA"]

t_hosts = list(hosts["keyA"])
if key == "keyB":
    t_hosts += hosts["keyB"]

或通过串联创建新列表,请使用:

t_hosts = hosts["keyA"]
if key == "keyB":
    t_hosts = t_hosts + hosts["keyB"]