使用python请求的顺序请求

时间:2013-11-12 16:48:24

标签: python for-loop timeout request sequential

现在我正在使用Flask,我在尝试使用python请求模块执行多个GET请求时遇到了麻烦。

如果我尝试发送一系列请求,第一个请求成功完成,但其他请求会抛出超时异常。

以下是视图代码的一部分:

import requests

sess = requests.Session()
site_url = 'http://www.example.com/api/'
steps = ['first_step', 'second_step', 'third_step']
step_responses = dict()
for s in steps:
    try:
        req = sess.get(site_url + s, timeout=5))
    except requests.exceptions.Timeout:
        return jsonify({'result':False, 'error':'timeout'})
    except requests.exceptions.ConnectionError:
        return jsonify({'result':False, 'error':'connection_error'})
else:
        step_responses[s] = True

如果我将此部分提取到独立的.py文件中,则会成功完成。

import requests

sess = requests.Session()
site_url = 'http://www.example.com/api/'
steps = ['first_step', 'second_step', 'third_step']
step_responses = dict()
for s in steps:
    try:
        req = sess.get(site_url + s, timeout=5)
    except requests.exceptions.Timeout:
        step_responses[s] = 'timeout'
    except requests.exceptions.ConnectionError:
        step_responses[s] = 'conn_error'
    else:
        step_responses[s] = 'ok'
print step_responses

2 个答案:

答案 0 :(得分:0)

适合我。您可能需要检查第二步和第三步

import requests

sess = requests.Session()
def module():
site_url = 'http://stackoverflow.com/'
steps = ['users', 'questions', 'tags']
step_responses = dict()
for s in steps:
    try:
        req = sess.get(site_url + s, timeout=5)
    except requests.exceptions.Timeout:
        return jsonify({'result':False, 'error':'timeout'})
    except requests.exceptions.ConnectionError:
        return jsonify({'result':False, 'error':'connection_error'})
else:
        step_responses[s] = True

答案 1 :(得分:0)

您可能希望确保从req对象中读取所有值。 我想你可能需要req.text和req.status_code或req.content

在这里检查页面的中间位置:http://docs.python-requests.org/en/latest/api/#request-sessions他们在那里讨论会话参数 “class requests.adapters.HTTPAdapter(pool_connections = 10,pool_maxsize = 10,max_retries = 0,pool_block = False)”

我完全不确定如何使用连接池等等,但文档会说(http://docs.python-requests.org/en/latest/user/advanced/)(寻找保持活跃)

“请注意,只有在读取了所有正文数据后,才会将连接释放回池中以供重用;请确保将stream设置为False或读取Response对象的content属性。”