Я пытаюсь инициализировать 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
каждый раз, когда мне нужно получить другую страницу. Я даже на правильном пути или совершенно неправильно?
Привет, нет, это не в цикле. Я буду вызывать этот python из файла .php, когда мне нужно: exec("/usr/bin/python3.6 /var/www/html/AutoBot/py_functions/functionality.py 2>&1 '$param' ", $ выход); Эта часть работает нормально. Спасибо
Если $param имеет значение update, будет вызвана часть update, если $param — login, будет вызвана часть login и т. д.
И как вы ожидаете, что атрибуты сеанса будут переноситься между двумя различными выполнениями вашего скрипта Python? Другими словами: вы на самом деле не верите, что когда вы запускаете новый процесс Python с параметром update
, он волшебным образом получает доступ к файлам cookie, созданным в каком-то предыдущем процессе Python, который был вызван с параметром login
, не так ли?
Весь смысл requests.Session
заключается в том, чтобы сохранять эфемерные константы (например, файлы cookie) между запросами. В вашем коде вы инициализируете новый объект сеанса, когда вы инициализируете объект LoginLogout
.
Вы делаете это здесь:
if switch_parameter == "login":
login_var = LoginLogout()
...
И вы делаете это здесь:
elif switch_parameter == "update":
update_prem = LoginLogout()
...
Теперь login_var
и update_prem
, очевидно, разные объекты, и оба имеют атрибут s
, каждый из которых содержит свой объект requests.Session
. Как вы ожидаете, что атрибуты одного сеанса будут волшебным образом доступны для другого?
Если вы хотите использовать существующий сеанс, используйте его. Не создавайте новый.
Конечно, я не знаю о вашем фактическом варианте использования, но из того, что вы здесь представили, кажется, вам нужно сделать что-то вроде этого:
scraper_obj = LoginLogout()
scraper_obj.login(USER, PASSWORD, SERVER)
...
scraper_obj.update('...')
...
scraper_obj.logout()
Поскольку вы создали оболочку вокруг фактического экземпляра requests.Session
с помощью LoginLogout
, вам никогда не придется иметь дело с его атрибутом s
напрямую, если у вас есть методы на LoginLogout
для каждого типа запроса, который вы хотите сделать. Вы инициализируете его один раз, а затем используете его методы для выполнения запросов через его внутренний объект сеанса.
Вы случайно упомянули в последующем комментарии, что вы настроили это как сценарий, который будет многократно вызываться извне, и в зависимости от параметра, переданного сценарию, вы хотите либо войти на сайт, либо очистить определенную страницу.
Это показывает, что вы либо не понимаете, как работает «вход в систему», либо не понимаете, как работают процессы. Обычно некоторый атрибут сеанса (например, файл cookie) создается на клиенте, чтобы он мог представить его серверу, чтобы показать, что он уже аутентифицирован. При использовании requests
в качестве клиентской библиотеки HTTP эти данные хранятся внутри объекта requests.Session
.
Когда вы вызываете скрипт Python, вы создаете новый процесс. Тот факт, что вы запускаете один и тот же сценарий дважды подряд, не означает, что один из этих процессов имеет какую-либо связь с другим. Вызов скрипта для входа в систему один раз абсолютно не влияет на то, что произойдет в следующий раз, когда вы вызовете этот скрипт для выполнения чего-то еще. Ни один из этих более ранних атрибутов сеанса не будет присутствовать во втором процессе. Надеюсь, теперь это ясно.
Ааа, так что, скорее всего, он должен быть внутри цикла, чтобы он оставался постоянным. Хм. Тогда я не могу вызвать скрипт python с параметром, когда мне нужно. проклятие. Каждый раз это будет новая сессия. Что за хрень я закодировал, аааа. Мне нужно придумать другой подход. Спасибо, ДФ.
Привет, если честно, мой мозг полностью проигнорировал ту часть, в которой недавно вызывается скрипт Python, поэтому никакие предыдущие атрибуты не будут использоваться. И tbh2, я начал с кодирования пару недель назад, так что здесь все еще новичок :). В любом случае спасибо за вашу поддержку.
@BedSon Не беспокойтесь. Начинать делать глупости — это нормально. Часто возвращение к основам, даже если оно может быть сухим и скучным, действительно помогает прояснить и избавиться от нечеткости/бессмыслицы, найденной в Интернете, поэтому я указал на ваше кажущееся непонимание ни HTTP, ни системных процессов, поэтому как подтолкнуть вас к литературе по этим темам.
Да, просто читать книги довольно скучно. И теперь я просто застрял на странице 200 и не могу идти дальше. Я хотел попробовать несколько вещей, которые я читал, и сделать это обучение более интересным, но сессии и подобные вещи не являются частью книги. Итак, я просмотрел несколько видеороликов YT, и, видимо, впереди у меня еще большая дорога.
второй код в цикле while? Пожалуйста, поделитесь точным кодом, который у вас есть