我不知道如何提出这个问题,但我会解释一下。
我使用请求登录这样的网站
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()并且工作我不知道为什么= =
谢谢大家。
答案 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"对象