Почему вывод json такой маленький? - PullRequest
0 голосов
/ 17 июня 2020

Этот вывод должен быть намного длиннее, чем здесь.

Я начинаю с запроса GET, анализирую список JSON и извлекаю идентификатор, который затем вызываю во второй функции, которая даст мне второй идентификатор, который затем я буду использовать для вызова третьей функции. Но я получаю только одну запись, тогда как мне должно быть намного больше записей.

Код следующий:

from requests.auth import HTTPBasicAuth
import requests
import json
import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

def countries():
    data = requests.get("https://localhost:8543/api/netim/v1/countries/", verify=False, auth=HTTPBasicAuth("admin", "admin"))
    rep = data.json()
    return [elem.get("id","") for elem in rep['items']]


def regions():
    for c in countries():
        url = requests.get("https://localhost:8543/api/netim/v1/countries/{}/regions".format(c), verify=False, auth=HTTPBasicAuth("admin", "admin"))
        response = url.json()
        return [cid.get("id","") for cid in response['items']]


def city():
    for r in regions():
        api = requests.get("https://localhost:8543/api/netim/v1/regions/{}/cities".format(r), verify=False, auth=HTTPBasicAuth("admin", "admin"))
        resolt = api.json()
        return(json.dumps([{"name":r.get("name",""),"id":r.get("id", "")} for r in resolt['items']], indent=4))
city()

print(city())

Результат следующий:

[
    {
        "name": "Herat",
        "id": "AF~HER~Herat"
    }
]

У меня должен быть огромный список, поэтому я не уверен, что мне не хватает?

1 Ответ

1 голос
/ 17 июня 2020

Вам нужно go через все итерации вашего l oop и собрать результаты, затем jsonify и вернуть их.

data = []
for r in regions():
    api = requests.get("https://localhost:8543/api/netim/v1/regions/{}/cities".format(r), verify=False, auth=HTTPBasicAuth("admin", "admin"))
    resolt = api.json()
    data.extend([{"name":r.get("name",""),"id":r.get("id", "")} for r in resolt['items']])
return json.dumps(data, indent=4)

Это будет исправление для city(), но у вас одна и та же проблема во всех ваших функциях. return немедленно выходит из функции и больше ничего не делает, фактически все ваши for циклы выполняют одну итерацию.

Я обновлю свой пример здесь, чтобы вы лучше понимали, что происходит.

Ваши функции в основном следующие:

def test_fn():
    for i in [1,2,3,4]:
        return i
# output:
1
# We never see 2 or 3 or 4 because we return before looping on them.

Что вы хотите:

def test_fn():
    results = []
    for i in [1,2,3,4]:
        results.append(i)
    return results
# output
[1,2,3,4]

Похоже, вы понимаете, что for l oop будет какое-то действие один раз для каждого элемента в списке. Вы не понимаете, что return завершает функцию СЕЙЧАС. Больше нет для l oop, больше никаких действий, и в вашем коде вы немедленно возвращаетесь внутрь для l oop, останавливая любые дальнейшие действия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...