Python:通过POST请求URL并在浏览器中显示结果
我是一款大型图形界面应用程序的开发者,我们有一个网站用来跟踪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 个回答
你可以使用 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 所建议的那样。
我不知道有什么方法可以直接在网页浏览器中打开一个POST请求的结果,而不需要先把结果保存到文件里再打开。
那我们换个思路,暂时把数据存储在服务器上。这样就可以通过一个简单的ID参数在浏览器中打开页面,显示已经部分填写好的表单。
这不是一个正式的答案,但它也能奏效。
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')