如何长时间使用Python Requests会话?

-1 投票
3 回答
1911 浏览
提问于 2025-04-18 16:05

我不知道该怎么问这个问题,但我会解释一下。

我用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”这个循环,我就必须重新登录吗?

我的问题是,如何在不使用“with”循环的情况下访问另一个页面呢?

EDIT1:

补充:我第一次尝试使用 s=requests.Session()

但出现了这样的错误:

Python Requests尝试向Laravel发送数据

EDIT2:

我再次尝试使用 s = requests.session(),这次成功了,我也不知道为什么 = =

谢谢大家。

3 个回答

0

再详细说一下:
“Python Requests尝试向Laravel发送数据”这个错误,实际上是Laravel服务器出现了问题,而不是Python的问题。

s=requests.session()

这段代码应该可以正常工作,你可以在任何地方使用这个“s”会话对象。你甚至可以把“s”对象作为参数传递给其他函数。

使用

with requests.session() as s:

只是把“s”对象的作用范围限制在“with”下面的那段代码里。你可以在这个范围内的函数中使用“s”,但是如果在这个范围外的地方写代码,就无法使用这个“s”对象了。

2

如果你不想在最后关闭会话,就不要使用 with 这个块。你可以直接这样做:

s = requests.session()

然后根据需要把 s 传来传去就可以了。

2

为了更好地理解Daniel的回答,with这个块其实是一个叫做上下文管理器的东西。它会为你打开一个新的环境,在你的例子中,就是你调用的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()

撰写回答