Найти - Пользователи
Полная версия: Как проигнорировать ошибку перенаправления на другой url: urllib.error.HTTPError: HTTP Error 302
Начало » Python для экспертов » Как проигнорировать ошибку перенаправления на другой url: urllib.error.HTTPError: HTTP Error 302
1
Isem
Возникла такая вот проблема, которую не могу решить своими силами.
Коротко словами: Требуется аутентификация при обращении на https страницу. Там мы вводим логин с паролем и после этого сервер всегда перенаправляет нас на один из двух url: в случае успеха или в случае удачи. Проблема в том, что в обоих случаях он выдает ошибку 302 (это у него такая особенность и от меня это не зависит). Все-бы ничего, но я urllib в этом случае завершает свою работу с генерацией ошибки, хотя успешный переход на новый url происходит.
Собственно, код:
import urllib.request, http.client
http.client.HTTPConnection.debuglevel = 1
params = urllib.parse.urlencode({'login': '***', 'password': '***'})
params = params.encode('utf-8')
request = urllib.request.Request('https://*****/login.php',
                                 data=params) 
opener = urllib.request.build_opener() # тут были попытки сделать свой RedirectHandler и ErrorProcessor
f = opener.open(request)
>>>
 Traceback (most recent call last):
......
urllib.error.HTTPError: HTTP Error 302: Found - Redirection to url '/interface.php' is not allowed
То есть дальше я ничего не могу делать с этой “открытой” страницей.
Может быть так принято писать сервера с выдачей ошибки 302, или может я не понимаю чего-то. Если у кого есть какие-нибудь размышления, я готов внимательно выслушать.
p.s. Тема эта для меня нова, поэтому мог не совсем корректно поставить вопрос.
reclosedev
POST Запрос редиректится, а urllib это не нравится:
FancyURLopener
Note According to the letter of RFC 2616, 301 and 302 responses to POST requests must not be automatically redirected without confirmation by the user. In reality, browsers do allow automatic redirection of these responses, changing the POST to a GET, and urllib reproduces this behaviour.

Вроде решение:
http://coding.derkeiler.com/Archive/Python/comp.lang.python/2009-01/msg01578.html

Еще, не увидел обработку кук, без них сайт не узнает, что клиент залогинен.

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

Isem
Спасибо за инфо.
Если я ловлю эту ошибку (HTTPError 302), то по ней я могу узнать, что переключение произошло на ту страницу, которая считается successful. А подключив обработку кукисов, сервер еще и выдает SESSID.
# возможно, это чопорно, но смог таким образом получить cookie от сервера, хотя urllib и ругается на 302 ошибку
j = http.cookiejar.CookieJar()
.....
cookie_proc = urllib.request.HTTPCookieProcessor(  j )
opener = urllib.request.build_opener( cookie_proc )
.....
Значит ли, что мне больше ничего и не надо, если после этого мне нужно делать запрос уже на другую (заранее известную страницу) с указанием этого SESSID?
А с библиотеками ограничен, то есть возможность использования только стандартные, включенные в python.

p.s. Спасибо за ссылки на полезные библиотеки.
py.user.next
Isem
Требуется аутентификация при обращении на https страницу. Там мы вводим логин с паролем и после этого сервер всегда перенаправляет нас на один из двух url: в случае успеха или в случае удачи.
http.client.HTTPSConnection() ?
Isem
py.user.next
http.client.HTTPSConnection() ?
С помощью этих классов я даже не смог залогиниться, уж не знаю почему. Поэтому переключился на urllib после гугливания.
py.user.next
Isem
я даже не смог залогиниться, уж не знаю почему
а как ты логинился ?
urllib делает то же самое
Isem
py.user.next
а как ты логинился ?
Ну сам логин проходит. Но я что-то не нашел, как ловить в этом случае редирект и кукисы.
Но, в общем то, проблему решил (с помощью urllib). Хотя, конечно, в другом варианте тоже было бы интересно разобраться.
py.user.next
Isem
Ну сам логин проходит. Но я что-то не нашел, как ловить в этом случае редирект и кукисы.
а что там в ответе ?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB