Request.Session() каждый раз создает разные сеансы. Как использовать повторно?

Я пытаюсь инициализировать 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 каждый раз, когда мне нужно получить другую страницу. Я даже на правильном пути или совершенно неправильно?

второй код в цикле while? Пожалуйста, поделитесь точным кодом, который у вас есть

azro 27.11.2022 10:11

Привет, нет, это не в цикле. Я буду вызывать этот python из файла .php, когда мне нужно: exec("/usr/bin/python3.6 /var/www/html/AutoBot/py_functions/functionality.py 2>&1 '$param' ", $ выход); Эта часть работает нормально. Спасибо

BedSon 27.11.2022 10:26

Если $param имеет значение update, будет вызвана часть update, если $param — login, будет вызвана часть login и т. д.

BedSon 27.11.2022 10:28

И как вы ожидаете, что атрибуты сеанса будут переноситься между двумя различными выполнениями вашего скрипта Python? Другими словами: вы на самом деле не верите, что когда вы запускаете новый процесс Python с параметром update, он волшебным образом получает доступ к файлам cookie, созданным в каком-то предыдущем процессе Python, который был вызван с параметром login, не так ли?

Daniil Fajnberg 27.11.2022 10:30
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
270
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Весь смысл 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 для каждого типа запроса, который вы хотите сделать. Вы инициализируете его один раз, а затем используете его методы для выполнения запросов через его внутренний объект сеанса.


PS

Вы случайно упомянули в последующем комментарии, что вы настроили это как сценарий, который будет многократно вызываться извне, и в зависимости от параметра, переданного сценарию, вы хотите либо войти на сайт, либо очистить определенную страницу.

Это показывает, что вы либо не понимаете, как работает «вход в систему», либо не понимаете, как работают процессы. Обычно некоторый атрибут сеанса (например, файл cookie) создается на клиенте, чтобы он мог представить его серверу, чтобы показать, что он уже аутентифицирован. При использовании requests в качестве клиентской библиотеки HTTP эти данные хранятся внутри объекта requests.Session.

Когда вы вызываете скрипт Python, вы создаете новый процесс. Тот факт, что вы запускаете один и тот же сценарий дважды подряд, не означает, что один из этих процессов имеет какую-либо связь с другим. Вызов скрипта для входа в систему один раз абсолютно не влияет на то, что произойдет в следующий раз, когда вы вызовете этот скрипт для выполнения чего-то еще. Ни один из этих более ранних атрибутов сеанса не будет присутствовать во втором процессе. Надеюсь, теперь это ясно.

Ааа, так что, скорее всего, он должен быть внутри цикла, чтобы он оставался постоянным. Хм. Тогда я не могу вызвать скрипт python с параметром, когда мне нужно. проклятие. Каждый раз это будет новая сессия. Что за хрень я закодировал, аааа. Мне нужно придумать другой подход. Спасибо, ДФ.

BedSon 27.11.2022 11:00

Привет, если честно, мой мозг полностью проигнорировал ту часть, в которой недавно вызывается скрипт Python, поэтому никакие предыдущие атрибуты не будут использоваться. И tbh2, я начал с кодирования пару недель назад, так что здесь все еще новичок :). В любом случае спасибо за вашу поддержку.

BedSon 27.11.2022 11:18

@BedSon Не беспокойтесь. Начинать делать глупости — это нормально. Часто возвращение к основам, даже если оно может быть сухим и скучным, действительно помогает прояснить и избавиться от нечеткости/бессмыслицы, найденной в Интернете, поэтому я указал на ваше кажущееся непонимание ни HTTP, ни системных процессов, поэтому как подтолкнуть вас к литературе по этим темам.

Daniil Fajnberg 27.11.2022 12:49

Да, просто читать книги довольно скучно. И теперь я просто застрял на странице 200 и не могу идти дальше. Я хотел попробовать несколько вещей, которые я читал, и сделать это обучение более интересным, но сессии и подобные вещи не являются частью книги. Итак, я просмотрел несколько видеороликов YT, и, видимо, впереди у меня еще большая дорога.

BedSon 27.11.2022 13:10

Другие вопросы по теме