urllib2: отправка формы с последующим перенаправлением - PullRequest
1 голос
/ 02 октября 2009

Моя цель состоит в том, чтобы предложить портативное решение urllib2, которое бы POST-форму и затем перенаправляло пользователя к тому, что выходит. POSTing часть проста:

request = urllib2.Request('https://some.site/page', data=urllib.urlencode({'key':'value'}))
response = urllib2.urlopen(request)

Предоставление data устанавливает тип запроса POST. Теперь я подозреваю, что все данные, о которых я должен заботиться, взяты из response.info() & response.geturl(). Я должен сделать self.redirect(response.geturl()) внутри get(self) метода webapp.RequestHandler.

Но что мне делать с заголовками? Что-нибудь еще, что я пропустил? Фрагменты кода высоко ценятся. :)

ТИА.

РЕДАКТИРОВАТЬ: Вот наивное решение, которое я придумал. Перенаправляет, но удаленный сервер показывает ошибку, указывающую, что нет соответствия с ранее отправленной формой:

info = response.info()
for key in info:
    self.response.headers[key] = info[key]
self.response.headers['Location'] = response.geturl()
self.response.set_status(302)
self.response.clear()

Ответы [ 3 ]

3 голосов
/ 02 октября 2009

Стандартный способ следовать перенаправлениям с urllib2 - это использовать HTTPRedirectHandler . (Не уверен, что вы подразумеваете под «тем, что выходит», но я предполагаю, что здесь стандартное перенаправление http, перенаправление javascript - это другой зверь)

# Created handler
redirectionHandler = urllib2.HTTPRedirectHandler() 

# 2 apply the handler to an opener
opener = urllib2.build_opener(redirectionHandler)

# 3. Install the openers
urllib2.install_opener(opener)


request = urllib2.Request('https://some.site/page', data=urllib.urlencode({'key':'value'}))
response = urllib2.urlopen(request)

См. urllib2.HTTPRedirectHandler для получения подробной информации о обработчике.

2 голосов
/ 02 октября 2009

Я подозреваю, что это почти всегда терпит неудачу. Когда вы размещаете форму, URL-адрес, на который вы в конечном итоге входите, - это просто URL-адрес, на который вы отправили сообщение. Отправка кого-либо по этому URL-адресу или даже посещение его снова с помощью того же браузера, который только что отправил, выполнит GET, и на странице не будет данных формы, которые были отправлены. Единственный способ, которым это будет работать, - это если сайт после POST перенаправляется на URL, содержащий некоторую информацию о сеансе.

0 голосов
/ 02 октября 2009

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

http://wwwsearch.sourceforge.net/mechanize/

...