2009-10-02 12 views
1

Mon but est de trouver une solution portable urllib2 qui POSTRAIT un formulaire et redirige l'utilisateur vers ce qui sort. La partie afficherons est simple:urllib2: soumettre un formulaire puis rediriger

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

Fournir data ensembles type de demande à POST. Maintenant, ce que je soupçonne toutes les données que je devrais se soucier vient de response.info() & response.geturl(). Je devrais faire un self.redirect(response.geturl()) à l'intérieur d'une méthode get(self) de webapp.RequestHandler.

Mais que dois-je faire avec les en-têtes? Y a-t-il autre chose que j'ai oublié? Les extraits de code sont très appréciés. :)

TIA.

EDIT: Voici une solution naïve que j'ai imaginée. Mais le serveur Redirects à distance affiche une erreur indiquant qu'il n'y a pas de match à la forme tition:

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() 
+0

voulez-vous rediriger vers « remettre » la session? (qui ne fonctionnera pas). ou voulez-vous montrer à l'utilisateur les résultats? (dans ce cas, vous pouvez simplement utiliser le html par procuration) –

+0

Oui, j'ai essayé d'effectuer un "transfert". – yanchenko

Répondre

2

Je soupçonne que cela échouera presque toujours. Lorsque vous POSTEZ un formulaire, l'URL vers laquelle vous vous trouvez est juste l'URL que vous avez publiée. Envoyer une autre personne à cette URL, ou même la visiter à nouveau avec le même navigateur que POSTed, va faire un GET et la page n'aura pas les données de formulaire qui ont été postées. La seule façon dont cela fonctionnerait est si le site redirigé après le POST vers une URL contenant une sorte d'info de session.

+0

Donc, je POSTE quelque chose à une URL, le serveur définit un cookie dans la réponse et ne redirige pas. Maintenant, je mets le même cookie au client et le redirige vers cette URL. Qu'est-ce que je me trompe? – yanchenko

+0

La plupart des navigateurs (tous?) Ne permettent pas à votre site de définir un cookie pour un autre site, donc cela ne fonctionnerait pas même si le site que vous demandez effectue une gestion de session plutôt que de répondre directement à un message. Je pense que ce que vous décrivez est tout simplement impossible. – geoffspear

3

La méthode standard pour suivre les redirections avec urllib2 consiste à utiliser le. (Je ne sais pas ce que vous entendez par « ce qui sort », mais je suppose une norme http redirect ici, javascript redirection est une bête différente)

# 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) 

Voir urllib2.HTTPRedirectHandler pour plus de détails sur le gestionnaire.

+0

Ainsi, le navigateur client 1) soumet un formulaire (POST) 2) est redirigé vers une page (GET). Je veux faire 1 sur le serveur et laisser 2 au navigateur du client (comme c'est fait 1 lui-même). – yanchenko

Questions connexes