2012-01-11 101 views
0

我必须一次提交两个表单,而且我不需要JavaScript。所以我认为我可以将表格发布给自己,做我的工作,然后发布给第三方支付提供商。这是为了让订单出现在我们的数据存储中。该手册说明如何通过HTTP POST提交表单,但我不知道如何将用户的浏览器引导至此页面。有没有办法?而不是直接发布形式向第三方的我觉得做这样的事:立即提交2个表单

def post(self): 
    import urllib 
    #do my work 
    params = urllib.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0}) 
    f = urllib.urlopen("http://www.thirdparty.com/cgi-bin/query", params) 
    #direct the user to the reponse page but how? 

它将努力提交表单,但用户必须采取的页面。有没有办法做到这一点?

感谢所有帮助

回答

2

也有一些是你可以这样做:

得到这个职位,形式,做的东西你的服务器上,然后返回一个重定向页面包含与同一个表单params但是对远程目标采取行动。

然后,您可以使用小js自动提交表单,并向用户提供诸如“不重定向?点击此处”之类的内容。

所以它不像你期望的那样工作,它也使用js,但我没有找到更好的方法来处理这项工作。希望这可以以任何方式帮助。

+0

我认为它会工作。整件事情都是向PayPal等第三方提交表单,我需要“拦截”并将订单保存到我的数据存储区。谢谢你的答案。 – 2012-01-11 18:55:12

+1

执行此操作的常用方法是首先创建订单,然后将用户重定向到订单摘要页面(他可以在其上检查/保存/打印),并将标准PayPal按钮放置在那里。 – 2012-01-12 00:16:44

+0

谢谢你的帮助。我只是想知道如何让用户在重定向页面取消订单。我可以有一个清理这个的批处理作业,但是更好的情况是,只有实际与第三方提供者一起提交的订单才会写入到我的数据存储中。 – 2012-01-12 11:13:23

2

您可以使用307重定向,这将保留所有POST参数(您需要确保您的servlet使用的POST参数与远程服务器使用的POST参数相同)。

self.response.set_status(307) 
self.response.headers['Location'] = "http://www.thirdparty.com/cgi-bin/query" 

但是,并非所有的浏览器都能正确实现307。看到这里:Response.Redirect with POST instead of Get?

该响应是旧的,所以也许更多的浏览器现在正确地处理307。

+0

谢谢你的回答。 – 2012-01-12 11:13:33