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

10 投票
4 回答
13156 浏览
提问于 2025-04-17 09:02

我是一款大型图形界面应用程序的开发者,我们有一个网站用来跟踪bug。任何人都可以在这个bug跟踪网站上提交新的bug。我们可以从桌面应用程序中检测到某些故障(比如未处理的异常),在这种情况下,我们希望在用户预设的浏览器中打开提交新bug的表单,并将我们能收集到的关于故障的信息添加到一些表单字段中。我们可以使用GET或POST这两种http方法来获取提交新bug的表单,并且可以为该表单提供默认的字段值。所以从http服务器的角度来看,一切都还不错。

到目前为止,我们可以成功地打开一个URL,并通过GET参数在URL中传递默认值,这个过程是通过Python标准库中的webbrowser模块实现的。然而,这种方法有一些限制,比如某些浏览器(尤其是微软的IE)对URL的最大长度有限制。webbrowser模块似乎没有办法使用POST请求URL。另一方面,有一个叫urllib2的模块,它提供了我们想要的控制方式,但据我所知,它没有在用户首选浏览器中打开获取到的页面的功能。

有没有办法实现我们想要的这种混合行为(结合urllib2的精细控制和webbrowser的高级功能)?

附言:我们考虑过用urllib2获取URL,将其内容保存到临时文件中,然后用webbrowser打开这个文件。这种方法有点麻烦,而且在这种情况下我们还需要处理其他问题,比如相对URL。有没有更好的解决方案?

4 个回答

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 

如果服务器可以轻松修改,另一个更好的方法是使用 urllib2 发起一个带有部分参数的 POST 请求,然后用 webbrowser 打开服务器生成的链接,正如 @Acorn 所建议的那样。

6

我不知道有什么方法可以直接在网页浏览器中打开一个POST请求的结果,而不需要先把结果保存到文件里再打开。

那我们换个思路,暂时把数据存储在服务器上。这样就可以通过一个简单的ID参数在浏览器中打开页面,显示已经部分填写好的表单。

9

这不是一个正式的答案,但它也能奏效。

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

撰写回答