我正在尝试初始化一个requests.Session
,以保持与网页的连接。但是,我读到每次调用会话类时,都会创建一个新的会话。
如何才能保持连接有效呢?因为在我当前的代码中,在我调用login
方法后,它会给我提供网页内容(这没关系,它显示我登录了该页面,并给我提供了我想要的内容),但当我调用update
方法时,它会再次给我登录页面的内容,而不是登录后我真正想要的页面。
import requests
class LoginLogout:
# creating session
def __init__(self):
self.s = requests.Session()
# login method
def login(self, user, password, server):
payload_data = {'user': user, 'pass': password, 'server': server}
print(self.s.post(LOGIN_LINK, payload_data))
# update method
def update(self, updt_link):
print(self.s.get(updt_link))
def logout(self):
response = self.s.get('...some webpage/user/logout...')
self.s.close()
print(response)
我在这里称之为对象:
if switch_parameter == "login":
login_var = LoginLogout()
login_var.login(USER, PASSWORD, SERVER)
print('IS IT OK ?', login_var.s.get('.../login...')) # <-OK it shows 200 result (but should I use there "s" too ?)
elif switch_parameter == "start":
start()
elif switch_parameter == "stop":
stop()
elif switch_parameter == "update":
update_prem = LoginLogout()
update_prem.update('...different/page...')
# (am I missing here "s" ?, or I shouldnt be using it here anyway)
elif switch_parameter == "logout":
logout()
else:
pass
我在这里做错了什么?我只是想使用login
登录网站并保持会话处于活动状态,而每次我需要获得另一个页面时都调用update
。我是在正确的轨道上还是完全错了?
1条答案
按热度按时间nx7onnlm1#
requests.Session
的全部意义在于在请求之间持久化短暂的常量(如cookie)。在代码中,当初始化LoginLogout
对象时,初始化一个新的会话对象。您可以在这里执行此操作:
你在这里这样做:
现在
login_var
和update_prem
显然是不同的对象,并且都有s
属性,每个都有一个不同的requests.Session
对象。如果要使用现有会话,请使用它。不要创建新会话。
当然,我不知道您的实际使用情形,但从您在这里介绍的内容来看,您似乎需要执行以下操作:
由于您使用
LoginLogout
创建了一个 Package 器来 Package 实际的requests.Session
示例,因此您不需要直接处理它的s
属性,假设您在LoginLogout
上为您要发出的每种请求都有方法。您只需初始化它一次,然后使用它的方法通过其内部会话对象执行请求。PS版
你在后续评论中偶然提到,你把它设置成一个脚本,从外部重复调用,根据传递给脚本的参数,你要么登录到网站,要么抓取一个特定的页面。
这表明你甚至不了解“登录”是如何工作的,或者你不了解进程是如何工作的。通常在客户端上创建一些会话属性(例如cookie),这样它就可以向服务器显示它已经通过了身份验证。当使用
requests
作为HTTP客户端库时,这些数据存储在requests.Session
对象中。调用Python脚本时,您创建了一个新进程。仅仅因为您连续两次启动同一个脚本并不意味着其中一个进程与另一个进程有任何连接。调用脚本登录一次绝对不会影响下次调用该脚本执行其他操作时发生的情况。第二个进程中不会出现任何先前的会话属性。我希望这一点现在已经清楚了。