如何长时间使用Python请求会话?

时间:2014-08-05 15:27:36

标签: python python-requests

我不知道如何提出这个问题,但我会解释一下。

我使用请求登录这样的网站

URL = 'http://test.dev/api/login'
with requests.session() as s:
    s.get(URL)
    login_data = {'username': 'test', 'password': 'testtest'}
    ra=s.post(URL, data=login_data)
    # Now I got session and cookie I can go to another pages like
    r=s.get('http://test.dev/api/user/1')

登录成功后,服务器发回会话和cookie。

但如果我带着“带”的循环出去,我必须再次登录?

问题是如何在没有“with”循环的情况下进入另一页?

EDIT1:

编辑:我尝试在s = requests.Session()第一次使用

但是这样的错误:

Python Requests trying to post data to Laravel

EDIT2:

我尝试再次使用s = requests.session()并且工作我不知道为什么= =

谢谢大家。

3 个答案:

答案 0 :(得分:2)

如果您不想在结束时关闭会话,请不要使用with块。只是做

s = requests.session()

并根据需要传递s

答案 1 :(得分:2)

为了扩展Daniel的回答,with阻止是context manager。它会为您打开一个新的环境,在您的情况下,您可以拨打requests.session()。块完成后,上下文将被关闭。

在您的示例中,一旦行r=s.get(...)完成,就不再有上下文代码,因此它已关闭。例如,这两个块实现了相同的结果:

with open('file.txt', 'w') as fh:
    fh.write('Hello, world')

fh = open('file.txt', 'w')
fh.write('Hello, world')
fh.close()

答案 2 :(得分:0)

进一步扩展这个: " Python请求尝试将数据发布到Laravel"错误只是意味着Laravel服务器存在问题 - 而不是python问题。

s=requests.session()

应该工作得很好,你可以使用" s"会话对象,无论您希望在哪里。你甚至可以通过" s" object作为其他函数的参数。

使用

with requests.session() as s:

仅仅限制了" s"反对"下" ...的缩进代码块。你可以传递" s"对于该块内的函数,但是在该块之外的编码留下了该块的上下文" s"对象