Flask-restful: запрос возвращает неправильное значение - PullRequest
0 голосов
/ 02 декабря 2018

Для небольшого домашнего проекта я попытался настроить простой сервер 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.Тогда первый звонок правильный, но все последующие запросы дадут мне другой ответ, чем я ожидал.

Что я делаю не так?Сначала я подумал, что у меня есть доступ к куки или сеансу.Но когда я переключаюсь на другой компьютер и пытаюсь получить доступ к API, я также получаю неверные данные.Я прочитал документацию о фляге и фляге-отдыхе.Я также читал о контексте приложения и контексте запроса, но мне чего-то не хватает.Может быть, кто-то из вас может дать мне полезную подсказку.

1 Ответ

0 голосов
/ 02 декабря 2018

Вы изменили список KeyA, добавив к нему список KeyB:

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

Это изменило список вместо ;+= Расширенное назначение - это не просто конкатенация, создающая новый объект списка.Вы можете сначала создать копию списка или создать новый список из конкатенации.

Чтобы создать копию, позвоните list() on 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"]
...