对于家里的一个小项目,我尝试设置一个简单的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的文档。我还阅读了有关应用程序上下文和请求上下文的信息,但是我缺少了一些东西。也许有人可以给我有用的提示。
答案 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"]