如何将浏览器用作桌面应用的UI?到目前为止我提出的方法是......
理想的解决方案适用于任何技术。我知道有一些选项可以编写Firefox扩展,但我希望在后端技术和浏览器独立性方面拥有完全的自由。
答案 0 :(得分:9)
请注意,如果您选择运行本地网络服务器,则会产生安全风险。
在同一台知道您的应用的计算机上运行的任何网页都可以使用Javascript向您的服务器发送请求,而您无法通过简单可靠的方式了解请求的来源。 (不要相信referer
标题)
使用类似方法的Google桌面有几个真实的漏洞,允许任何网页读取磁盘上的任何文件。
有几种方法可以防止这种情况发生;我建议要求每个请求都有一个auth密钥,该密钥是每台机器随机生成的(并在某个时候到期),您可以将其放入实际页面的源代码中。 XHR保护可以防止恶意网站读取授权密钥,使其无能为力。
答案 1 :(得分:4)
如果您正在寻找带有Kill链接的python Web服务器,您可以随时查看CherryPy。
import webbrowser
import cherrypy
import threading
class MyApp:
""" Sample request handler class. """
@cherrypy.expose
def index(self):
return """<html><head><title>An example application</title></head>
<body>
<h1>This is my sample application</h1>
Put the content here...
<hr>
<a href="/exit">Quit</a>
</body></html>"""
@cherrypy.expose
def exit(self):
raise SystemExit(0)
class MyBGThread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.start()
def run(self):
cherrypy.tree.mount(MyApp())
cherrypy.quickstart()
myThread = MyBGThread()
webbrowser.open("http://127.0.0.1:8080")
此代码基于cherrypy网站上SingleClickAndRun的示例: http://tools.cherrypy.org/wiki/SingleClickAndRun
请注意,与普通的WebApp相比,您可能会使用模板引擎并从main等方法加载模板。
一些不错的选择是在gui窗口中嵌入浏览器控件并在应用程序退出时关闭服务器。
为了安全起见,您可以添加身份验证方案。有一些是由cherrypy支持的,但您也可以使用工具模块实现自己的。
答案 2 :(得分:4)
我希望做同样的事情(桌面应用程序使用最新的HTML5 / CSS3浏览器作为桌面应用程序的GUI),只使用Ruby(我决定使用Ruby的各种原因)。令人惊讶的是人们提出的跨平台图书馆的数量。但是,几乎没有人做过任何尝试让网络浏览器成为桌面应用UI的工作。跨平台问题......好吧,我不会说已经解决了,但我会说正确方向的几个步骤。
对我来说,这将是新的HTML5 / CSS3标准的完美之处。我知道可以使用本地运行的Web服务器来完成。
另一种方式可能就像来自“280 North”的人们正在做他们所做的事情。他们开发了Objective-J(模仿Objective-C如何扩展常规C的常规JavaScript的扩展)和Cappuccino(Objective-J相当于Objective-C的Cocoa框架在MAC上工作)。他们还开发了“Atlas”,这是来自Xcode的Apple的“Interface Builder”的280 North版本,用于构建Internet应用程序的Objective-J和Cappuccino框架。 Atlas实际上是一个Cappuccino网络应用程序,作为桌面应用程序在桌面上运行。在这种情况下,他们使用Narwhal ...一个跨平台,通用的JavaScript平台,用于在浏览器之外开发JS应用程序(基本上是一个专门的Web服务器)。
如果任何人想出一个想法,使“浏览器,直接连接到桌面应用程序”工作,而不需要Web服务器共存,仍然可以操纵本地FS,我会非常感兴趣...嗯......现在我考虑一下,我想知道是否可以使用新的Google Chrome项目“Native Client”来做到这一点。 NaCL与Active X非常相似,除非您不限于Windows平台(但至少目前仅限于谷歌Chrome浏览器)。只有通过沙盒增加安全性,但你可以操纵本地FS ...我想的越多,我就越开始怀疑它可以做到。
有什么想法吗?
答案 3 :(得分:2)
在Windows中,您可以嵌入IE ActiveX控件,它使用与IE相同的渲染引擎。 (这是加号和减号)您可以在主机代码中设置ScriptObject
属性,并在Javascript中以window.external
的形式访问它,以执行Javascript无法执行的操作。
如果您运行本地网络服务器,您可以在应用中使用退出链接来杀死网络服务器。
答案 4 :(得分:1)
您没有提到您需要定位的操作系统。但是您可以创建一个程序状态的Web服务器,然后启动默认浏览器。等到用户终止浏览器,然后关闭Web服务器。
因此,例如在Windows上,您可以使用CreateProcess()来生成进程 然后MsgWaitForMultipleObjects()等待它完成执行。
答案 5 :(得分:1)
HTML应用程序(简称HTA)已经存在了一段时间。您可以阅读所有相关信息here。它们基本上是HTML和Javascript,带有一些额外的选项来创建窗口并可以访问本地文件系统。它们似乎正是你想要的。它是Microsoft技术,所以这只适用于Windows系统上的IE。我成功地将它用作CD-ROM的前端,用于向一年级学生分发软件
另一种选择是使用Adobe Air。我并不熟悉这项技术,但似乎提供了一个将网页部署为桌面应用程序的框架。我不能以访客身份发布第二个链接,但只是google它,你很快就会发现它。