Python:通过POST请求URL并在浏览器中显示结果

时间:2011-12-26 16:09:19

标签: python http urllib2 python-webbrowser

我是一个大型GUI应用程序的开发人员,我们有一个用于错误跟踪的网站。任何人都可以向bug跟踪站点提交新的bug。我们可以从桌面应用程序中检测到某些失败(即未处理的异常),在这种情况下,我们希望在用户预定义的浏览器中打开submit-new-bug表单,添加我们可以收集的有关失败的任何信息一些表单字段。我们可以使用GET或POST http方法检索submit-new-bug表单,我们可以为该表单提供默认字段值。所以从http服务器端来看,一切都很好。

到目前为止,我们可以使用Python标准库中的the webbrowser module成功打开一个URL,将默认值作为GET参数传递给URL。但是,有一些limitations of this method,例如某些浏览器(specially MS IE)的URL允许的最大长度。 webbrowser模块似乎无法使用POST请求URL。 OTOH有the urllib2 module提供我们想要的控制类型,但AFAIK它缺乏在用户首选浏览器中打开检索页面的可能性。

有没有办法让我们想要这种混合行为(urllib2具有webbrowser的更高级别功能的精细控制?

PS:我们考虑过使用urllib2检索网址的可能性,将其内容保存到临时文件并使用webbrowser打开该文件。这是一个有点讨厌的解决方案,在这种情况下,我们将不得不处理其他问题,如相对URL。有更好的解决方案吗?

3 个答案:

答案 0 :(得分:4)

我不知道您是否可以在Web浏览器中打开POST请求的结果而不将结果保存到文件并打开它。

如何采用替代方法并将数据临时存储在服务器上。然后可以使用简单的id参数在浏览器中打开页面,并显示保存的部分填充表单。

答案 1 :(得分:2)

您可以使用tempfile.NamedTemporaryFile()

import tempfile
import webbrowser
import jinja2

t = jinja2.Template('hello {{ name }}!') # you could load template from a file
f = tempfile.NamedTemporaryFile() # deleted when goes out of scope (closed)
f.write(t.render(name='abc'))
f.flush()
webbrowser.open_new_tab(f.name) # returns immediately 

如果可以轻松修改服务器,更好的方法是使用POST使用部分参数发出urllib2请求,并使用webbrowser作为suggested by @Acorn打开服务器生成的网址。

答案 2 :(得分:0)

这不是正确的答案。但它也可以

import requests
import webbrowser

url = "https://www.facebook.com/login/device-based/regular/login/?login_attempt=1&lwv=110"
myInput = {'email':'mymail@gmail.com','pass':'mypaass'}
x = requests.post(url, data = myInput)
y = x.text
f = open("home.html", "a")
f.write(y)
f.close()
webbrowser.open('file:///root/python/home.html')