【问题标题】:Using the reults of multiple for loops to post a single json response使用多个 for 循环的结果发布单个 json 响应
【发布时间】:2019-12-07 05:46:18
【问题描述】:

好的,所以这是一个加载的问题,但我确信这里有一个简单的方法可以使用,但我被卡住了。

长话短说,我的任务是在 python 中创建一个函数(运行 AWS lambda),它可以使用 python-requests 对一系列 URL 执行验收测试。这些请求将用于断言 HTTP 响应代码和自定义 HTTP 标头,用于标识 haproxy 后端是否正确。

URL 本身将保存在 yaml 文档中,该文档将在 python 中转换为 dict 并传递给 for 循环,该循环将使用 python requestsHTTP GET 的响应代码和 URL 标头.

我遇到的问题是让单个 body 对象返回多个 for 循环的结果。

我试图找到类似的用例,但找不到

import requests
import json
import yaml


def acc_tests():

    with open("test.yaml", 'r') as stream:
        testurls = yaml.safe_load(stream)

    results = {}
    # endpoint/path 1
    for url in testurls["health endpoints"]:
        r = requests.get(url, params="none")
        stat = r.status_code
        result = json.dumps(print(url, stat))
        results = json.dumps(result)

    # endpoint path  with headers
    for url in testurls["xtvapi"]:
        headers = {'H': 'xtvapi.cloudtv.comcast.net'}
        r = requests.get(url, headers=headers, params="none")
        stat = r.status_code
        head = r.headers["X-FINITY-TANGO-BACKEND"]
        result = json.dumps((url, stat, head))
        results = json.dumps(result)

    return {
        'statusCode': 200,
        'body': json.dumps(results)
    }


acc_tests()

YAML 文件:

health endpoints:
  - https://xfinityapi-tango-production-aws-us-east-1-active.r53.aae.comcast.net/tango-health/
  - https://xfinityapi-tango-production-aws-us-east-1-active.r53.aae.comcast.net/
  - https://xfinityapi-tango-production-aws-us-east-2-active.r53.aae.comcast.net/tango-health/
  - https://xfinityapi-tango-production-aws-us-east-2-active.r53.aae.comcast.net/
  - https://xfinityapi-tango-production-aws-us-west-2-active.r53.aae.comcast.net/tango-health/
  - https://xfinityapi-tango-production-aws-us-west-2-active.r53.aae.comcast.net/

xtvapi:
  - https://xfinityapi-tango-production-aws-us-east-1-active.r53.aae.comcast.net/
  - https://xfinityapi-tango-production-aws-us-east-2-active.r53.aae.comcast.net/
  - https://xfinityapi-tango-production-aws-us-west-2-active.r53.aae.comcast.net/

我认为正在发生的事情是两个for 循环都在一个接一个地运行,但results 的值是空的,但我不确定要更新/附加results 该怎么做dict 每个循环的结果。

【问题讨论】:

  • 你能发布一个来自testurls["health endpoints"] 和一个来自testurls["xtvapi"] 的示例网址吗?
  • for 循环的每次迭代中,您都将使用json.dumps(result) 覆盖它。因此最后,results 只包含最后一个结果。
  • @JackFleeting 这里是一个应该可以工作的 .yaml 文件。这些网址可公开访问
  • @dashmug 我明白你的意思,但我不确定是否有任何替代方案。据我所知,dictionary.update 只会更新 现有键的现有值。追加到字典的好方法是什么?仅使用列表是否值得?请记住,return 函数的 body 必须位于有效的 json 中,aws lambda 才能在 HTTP 响应中返回它。
  • 假设您只有来自health endpoints 的第一个网址和来自xtvapi 的第一个网址可以使用-body 究竟会是什么样子?

标签: json python-3.x loops python-requests yaml


【解决方案1】:

谢谢各位。我最终通过为每种测试类型创建一个带有不可变键的dict 来解决这个问题,然后使用append 将结果添加到字典中的嵌套列表中。

这是 AWS Lambda 函数中的“工作”代码:

from botocore.vendored import requests
import json
import yaml

def acc_tests(event, context):

    with open("test.yaml", 'r') as stream:
        testurls = yaml.safe_load(stream)

    results = {'tango-health': [], 'xtvapi': []}

    # Tango Health
    for url in testurls["health endpoints"]:
        r = requests.get(url, params="none")
        result = url, r.status_code
        assert r.status_code == 200
        results["tango-health"].append(result)

    # xtvapi default/cloudtv
    for url in testurls["xtvapi"]:
        headers = {'H': 'xtvapi.cloudtv.comcast.net'}
        r = requests.get(url, headers=headers, params="none")
        result = url, r.status_code, r.headers["X-FINITY-TANGO-BACKEND"]
        assert r.status_code == 200
        assert r.headers["X-FINITY-TANGO-BACKEND"] == "tango-big"
        results["xtvapi"].append(result)

    resbody = json.dumps(results)

    return {
        'statusCode': 200,
        'body': resbody
    }

【讨论】:

    猜你喜欢
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    相关资源
    最近更新 更多