我用Python编写了基本代码:
在进一步格式化代码方面需要帮助
发布于 2022-01-29 22:08:20
在这段代码中确实有很多重复。
你有三个案子: GET,POST,other。所以我们有:
if "GET" in res["request"]["method"]:
payload = {}
url = res["request"]["url"]["raw"]
method = res["request"]["method"]
elif "POST" in res["request"]["method"]:
url = res["request"]["url"]["raw"]
method = res["request"]["method"]
payload = res["request"]["body"]["raw"]
else:
url = res["request"]["url"]["raw"]
method = res["request"]["method"]
payload = res["request"]["body"]["raw"]现在我们有了一个简单的概述,我们可以将整个块简化如下:
url = res["request"]["url"]["raw"]
method = res["request"]["method"]
if "GET" in res["request"]["method"]:
payload = {}
else:
payload = res["request"]["body"]["raw"]方法之间的差别很小:有效载荷。
然后,我们着手处理请求本身:
# GET
response = requests.get(url, headers=headers, data=payload)
# POST
response = requests.request(
"POST", url, headers=headers, data=payload
)
# other
response = requests.request(
"POST", url, headers=headers, data=payload
)再说一遍,一切都很相似。我们可以构建这样一个通用语句:
method = res["request"]["method"]
response = requests.request(method, url, headers=headers, data=payload)没有必要使用3种不同的语句,因为它们都传递相同的参数。唯一不同的是方法,您也可以将其作为参数传递。
现在您有一个语句来发出请求,我们需要查看结果。这是一个简单的条件200或更多。因此:
if response.status_code == 200:
result = "OK"
else:
result = response.text
rows = [
{
"API_Endpoint": url,
"Method": method,
"Status_Code": response.status_code,
"Message": result,
"Timestamp": datetime.datetime.utcnow(),
}
]
writer.writerows(rows)据我所见,你重复了6次同样的事情。唯一变化的是方法+ HTTP状态代码和结果响应消息。这可以很容易地简化。
最后的f_object.close()并不是必需的,因为您正在使用上下文管理器(with)。
因此,您的代码已经可以像这样被缩短(未经测试,但希望简洁是可以察觉的):
with open("TestResults.csv", "w") as f_object:
fields = ["API_Endpoint", "Method", "Status_Code", "Message", "Timestamp"]
writer = csv.DictWriter(f_object, fieldnames=fields)
writer.writeheader()
headers = {"Authorization": "Bearer {}".format(GenerateToken())}
with open("postman_collection.json") as f:
data = json.load(f)
for res in data["item"]:
for d in res["request"]:
# common for all methods
url = res["request"]["url"]["raw"]
method = res["request"]["method"]
# empty payload for GET
if "GET" in res["request"]["method"]:
payload = {}
else:
payload = res["request"]["body"]["raw"]
try:
response = requests.request(method, url, headers=headers, data=payload)
if response.status_code == 200:
result = "OK"
else:
result = response.text
rows = [
{
"API_Endpoint": url,
"Method": method,
"Status_Code": response.status_code,
"Message": result,
"Timestamp": datetime.datetime.utcnow(),
}
]
writer.writerows(rows)
# print(response.json().get("message"))
except requests.ConnectionError:
print("failed to connect")因此,在删除重复代码之后,代码现在变得更易于管理了。基本上,我们从118条线路上升到43条。
该代码块可以放入一个函数中,该函数的名称应该反映实际用途(我们不知道)。那么最好将文件名作为参数传递,而不是让它们在函数中硬编码。
如果要对主机执行重复请求,那么应该使用requests.session来提高性能,简化状态、cookie、标头等的处理。
为了解决您的一些问题:如果目的是执行并行处理或多线程处理,那么在Python中有不止一种方法可以做到这一点。哪一个最好取决于你的情况。我可以推荐一个作为教程的链接:Python多线程和多处理教程。
但是您有两个不同的任务:写入CSV文件和向API发送数据。因此,将代码分成两个函数是有意义的。如果您要进行并行处理,那么基本上可以一次读取JSON一个项,然后输入一个“队列”。因此,您需要某种接受URL的函数,它带有可选的有效负载并返回您想要的任何内容,这可能只是基于HTTP状态代码的响应消息。如果您查看上面引用的链接并根据您的需要对其进行调整,也许您可以围绕现有代码构建一些内容。
我可能会编辑这篇文章,以增加更多的建议。
我还推荐Tarek & Michal编写的“专家Python编程”一书,如果您想深入了解这些主题的话。
https://codereview.stackexchange.com/questions/273515
复制相似问题