【发布时间】:2018-12-19 16:55:00
【问题描述】:
这是我的情况:
当我使用 for 循环登录某个 REST-Web 站点大约 100 ~ 500 次时,如果我使用 requests.post 方法启动我的请求,请求框架就会发出标题为 Bug 的问题。代码如下:
# coding: UTF-8
"""
@Author: ITACHY
@CreateTime:2018/12/19 17:26
"""
import datetime
import uuid
import requests
def login_test(num):
start = datetime.datetime.now()
url = XXXXX
uid = str(uuid.uuid4())
body = {
"type": "login",
"clientinfo":
{
"deviceid": uid,
"uid": uid,
"timezone": "Asia/Shanghai",
"osFamily": "ANDROID",
"osVersion": "22",
"deviceType": "MOBILE",
"deviceModel": "1.0",
"appVersion": "1.0.0-SNAPSHOT",
"location":
{
"longitude": 116.407394,
"latitude": 39.904211,
"type": "GCJ02"
}
}
}
header = {
'Content-Type': 'application/json; charset=UTF-8',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'
}
# response = requests.post(url, json = body, headers = header)
response = requests.post(url, json = body, headers = header)
if response.status_code == 200:
result = response.json()
print('Count: {}, Result: {}'.format(num, result))
if result["code"] == 0:
due = datetime.datetime.now() - start
print('Count: {}, Uid: {}, Token: {}, Time; {}, '.format(str(i), uid, result["data"]["accessToken"], str(due)))
else:
due = datetime.datetime.now() - start
print('Count: {}, Uid: {}, Response: {}, Time: {}, '.format(str(i), uid, result, str(due)))
else:
print('Count: {}, Login failed. Code: {}, Msg: {}'.format(num, response.status_code, response.text))
if __name__ == '__main__':
for i in range(500):
login_test(i)
但是当我将代码更改为以下内容时:
# coding: UTF-8
"""
@Author: ITACHY
@CreateTime:2018/12/19 17:26
"""
import datetime
import uuid
import requests
# import logging
def login(count, session):
start = datetime.datetime.now()
url = XXXXXXX
uid = str(uuid.uuid4())
body = {
"type": "login",
"clientinfo":
{
"deviceid": uid,
"uid": uid,
"timezone": "Asia/Shanghai",
"osFamily": "ANDROID",
"osVersion": "22",
"deviceType": "MOBILE",
"deviceModel": "1.0",
"appVersion": "1.0.0-SNAPSHOT",
"location":
{
"longitude": 116.407394,
"latitude": 39.904211,
"type": "GCJ02"
}
}
}
header = {
'Content-Type': 'application/json; charset=UTF-8',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'
}
# try:
# response = requests.post(url, json = body, headers = header)
response = session.post(url, json = body, headers = header)
if response.status_code == 200:
result = response.json()
# print(result)
if result["code"] == 0:
due = datetime.datetime.now() - start
print('Count: {}, Uid: {}, Token: {}, Time; {}, '.format(str(count), uid, result["data"]["accessToken"], str(due)))
else:
due = datetime.datetime.now() - start
print('Count: {}, Uid: {}, Response: {}, Time: {}, '.format(str(count), uid, result, str(due)))
else:
print('Login failed. Code: {}, Msg: {}'.format(response.status_code, response.text))
# except Exception as e:
# print(e)
if __name__ == '__main__':
with requests.Session() as session:
for i in range(5000):
login(i, session)
一切顺利,我认为第二种方法只创建一个会话,第一种方法创建很多会话,请检查一下。如果有人可以确认,请提前感谢
【问题讨论】:
-
顺便说一句:服务器在Apache NGINX后面,由Spring-Webflux REST-Style编写,容器是Undertow。
标签: python python-3.x python-requests