Flask-restful: 请求 returns 错误值
Flask-restful: Request returns wrong value
对于家里的一个小项目,我尝试设置一个简单的 RESTful 服务器。我正在努力解决一个问题,即服务器 returns 值是我不期望的。
这是描述我的问题的抽象示例:
# 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 的文档。我也读过应用程序上下文和请求上下文,但我遗漏了一些东西。也许你们中有人可以给我一个有用的提示。
您更改了 KeyA
列表,将 KeyB
列表附加到它:
t_hosts = hosts["keyA"]
if (key == "keyB"):
t_hosts += hosts["keyB"]
这改变了列表到位; +=
扩充赋值不仅仅是创建新列表对象的简单串联。您可以先创建列表的 copy,或者通过串联创建新列表。
要创建副本,请在 hosts["keyA"]
上调用 list()
:
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"]
对于家里的一个小项目,我尝试设置一个简单的 RESTful 服务器。我正在努力解决一个问题,即服务器 returns 值是我不期望的。
这是描述我的问题的抽象示例:
# 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 的文档。我也读过应用程序上下文和请求上下文,但我遗漏了一些东西。也许你们中有人可以给我一个有用的提示。
您更改了 KeyA
列表,将 KeyB
列表附加到它:
t_hosts = hosts["keyA"]
if (key == "keyB"):
t_hosts += hosts["keyB"]
这改变了列表到位; +=
扩充赋值不仅仅是创建新列表对象的简单串联。您可以先创建列表的 copy,或者通过串联创建新列表。
要创建副本,请在 hosts["keyA"]
上调用 list()
:
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"]