1

私の目標は、フォームをPOSTしてから、ユーザーを出力されるものにリダイレクトするポータブルurllib2ソリューションを考え出すことです。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

しかし、ヘッダーをどうすればよいですか?私が見落とした他の何か?コードスニペットは高く評価されています。:)

TIA。

編集:これが私が思いついた素朴な解決策です。リダイレクトしますが、リモートサーバーは以前にPOSTされたフォームに一致するものがないことを示すエラーを表示します。

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()
4

3 に答える 3

3

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を参照してください。

于 2009-10-02T01:57:40.467 に答える
2

これはほとんどの場合失敗すると思います。フォームを投稿すると、最終的に表示されるURLは投稿したURLだけになります。他の誰かをこのURLに送信するか、POSTしたばかりの同じブラウザで再度アクセスすると、GETが実行され、ページにはPOSTされたフォームデータが含まれません。これが機能する唯一の方法は、POST後にサイトが何らかのセッション情報を含むURLにリダイレクトされた場合です。

于 2009-10-02T01:51:37.600 に答える
0

urllib2を直接使用するよりも、mechanizeを使用する方がはるかに簡単です。

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

于 2009-10-02T04:22:42.913 に答える