LINUX.ORG.RU

запретить редирект в питоне


0

1

использую python3.2 и urllib

есть запрос, который кидает на редирект но по урлу редиректа уже можно понять то что нужно, и не грузить второй запрос

как бы так не дать питону перейти?

я попробовал переопределить http_error_302:

class RelativeRedirectHandler(urllib.request.HTTPRedirectHandler):
	def http_error_302(self, req, fp, code, msg, headers):

			...
			newurl = headers['location']
			...
		if newurl and 'notice=ok' in newurl:

			new = self.redirect_request(req, fp, code, msg, headers, newurl)

			if new is None:
				return

			fp.read()
			fp.close()
			return self.parent.open(new, timeout=req.timeout)

		return urllib.request.HTTPRedirectHandler.http_error_302(self, req, fp, code, msg, headers)

тут все что после проверки текста в новой ссылке - взято из request.py питона

сейчас он возвращает «urlopen error timed out», «HTTP Error 502: Proxy Error ( The Uniform Resource Locator (URL) does not use a recognized protocol», «403» и «HTTP Error 400: Bad Request» — все что угодно, только не качает нужную ссылку. Хотя все предыдущие ссылки открывает нормально.

Как запретить идти по конкретному редиректу?

Просто убери хендлер из оупенера.

baverman ★★★
()
Ответ на: комментарий от xtraeft

http://stackoverflow.com/questions/554446/how-do-i-

читал, там он просто забирает куки а мне надо завершить хендлер грамотно, чтобы он редиректы дальше не обрабатывал

Просто убери хендлер из оупенера.

у меня он делает это:

		if "location" in headers:
			headers.replace_header('location', urllib.request.urljoin("{0}://{1}/".format(req.get_type(), req.get_host()), headers["location"]))
			newurl = headers['location']
		elif "uri" in headers:
			headers.replace_header('uri', urllib.request.urljoin("{0}://{1}/".format(req.get_type(), req.get_host()), headers["uri"]))
			newurl = headers['uri']
		else:
			return

потому что сам питон с этим не справляется, а FancyUrl с этим куском кода мне уже не нужен

sergey-novikov ★★★
() автор топика
Ответ на: комментарий от sergey-novikov

Я бы просто сделал два оупенера:

from urllib2 import build_opener, HTTPRedirectHandler, OpenerDirector, HTTPError

redirect_opener = build_opener()

non_redirect_opener = OpenerDirector()
for h in redirect_opener.handlers:
    if not isinstance(h, HTTPRedirectHandler):
        non_redirect_opener.add_handler(h.__class__())

result = redirect_opener.open('http://google.com')
print 'redirected:\n ', result.url, '\n'

print 'not redirected:'
try:
    non_redirect_opener.open('http://google.com')
except HTTPError as e:
    print e.url
    print e.read()

Когда надо, ловишь редирект и руками обрабатываешь.

baverman ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.