如何长时间使用Python Requests会话?
我不知道该怎么问这个问题,但我会解释一下。
我用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()
但出现了这样的错误:
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()