Python 如何使用pyqt实现瘦客户端应用程序

Python 如何使用pyqt实现瘦客户端应用程序,python,qt,networking,pyqt,thin,Python,Qt,Networking,Pyqt,Thin,以下是我想做的,我想知道一些在这个领域有经验的人是如何做到这一点的: 我从http服务器收到三个POST请求: 小部件和布局 然后是应用程序逻辑(最小) 资料 或者最好将前两个或全部三个结合起来。我正在考虑使用pyqt。我想我可以加载.ui文件。我可以解析json数据。我只是认为通过网络传递代码在客户机上执行是相当危险的。如果有人可以劫持连接,或者可以更改应用程序设置以访问伪造的服务器,这是令人讨厌的 我想这样做,因为它让所有的客户都保持最新。它有点像一个webapp,但因为Qt而更简单。本质上

以下是我想做的,我想知道一些在这个领域有经验的人是如何做到这一点的:

我从http服务器收到三个POST请求:

  • 小部件和布局
  • 然后是应用程序逻辑(最小)
  • 资料
  • 或者最好将前两个或全部三个结合起来。我正在考虑使用pyqt。我想我可以加载.ui文件。我可以解析json数据。我只是认为通过网络传递代码在客户机上执行是相当危险的。如果有人可以劫持连接,或者可以更改应用程序设置以访问伪造的服务器,这是令人讨厌的

    我想这样做,因为它让所有的客户都保持最新。它有点像一个webapp,但因为Qt而更简单。本质上,“瘦”应用程序只是一个从服务器加载数据的最小编译python文件

    如何在不给客户端带来安全问题的情况下做到这一点?https足够好吗?有没有办法让pyqt在沙箱中运行

    顺便说一句,我并没有被Qt或python所困扰。不过我确实喜欢这个概念。我真的不想使用Java-服务器端或客户端。

    您希望从服务器向客户端发送“应用程序逻辑”,而不发送“代码”,这本身就是自相矛盾的,尽管您可能还没有意识到这一点——即使您发送的“逻辑”是用某种简化的特别“语言”(您甚至不认为是语言;-)编写的,无论出于何种目的,您的Python代码都将解释该语言,从而执行该代码。你可以在某种程度上“沙箱”事情,但最终,这就是你所做的

    相反,为了避免劫持和其他伎俩,请使用
    HTTPS
    并在客户端验证服务器的证书:这将保护您免受所有您担心的问题的影响(如果有人可以对应用程序进行足够的编辑,以使其无法通过HTTPS证书验证,那么他们可以对应用程序进行足够的编辑,使其运行所需的任何代码,而无需从服务器发送该代码;-)


    一旦您使用https,让服务器发送Python模块(如果您需要在客户机上支持多个Python版本,那么就以源代码的形式发送,否则字节码就可以了),然后客户机将其保存到磁盘并导入/重新加载,这样就可以了。您基本上是在做一个经典“插件体系结构”的变体,其中“插件”实际上是从服务器发送的(而不是在给定位置的磁盘上找到的)。

    使用web浏览器,它是一个有良好文档记录的系统,可以做您想要的一切。在浏览器中创建简单的图形应用程序也相对较快。我的推理示例如下:

    • math环境将其构建为一个在浏览器中运行的应用程序,以及一个本地web服务器

    • 有一个将Python编译成Javascript的项目。这是非常值得一试的

    编辑:

    • 您可以尝试使用的,作为通过网络传输的代码的安全Python解释器

    • 还有一个最简单的解决方案:只需通过网络发送Python模块,但对它们进行签名和/或加密。这是所有Linux发行版的工作方式。您将加密令牌存储在本地计算机上。服务器在发送代码之前使用匹配的令牌对代码进行签名/加密。应该能够做到这一点


    因此,尝试实现某种模板系统或语言,而不是执行纯python代码,这将是一种浪费时间的行为?我真的不希望客户端能够执行诸如remove()之类的操作.即使知道这是可能的,我也有点吓坏了。既然它的行为本质上类似于一个网络应用程序,那么有可能附加“动作”吗到.ui文件中的小部件并让应用程序解释操作?我注意到在Designer中我可以添加动态属性。动态属性是实现这一点的一种方法吗?@sims,模板系统/语言绝不是浪费时间,但您应该使用现有的系统/语言(
    Mako
    非常接近Python,因此我推荐,
    jinja2
    更类似于Django,但可以编译成Python代码,等等)——重新发明轮子是不值得的(除非你真正的目的是发现轮子是如何工作的,引用Atwood;-)但是,模板更多的是关于视图逻辑,而不是应用程序中使用的业务规则。至于
    删除
    问题,请确定您要防御的威胁模型--疯狂的用户?您的bug?&c。如上所述,我担心发生劫持等的可能性很小。我想采取与浏览器开发人员类似的立场(即不包括在内)不要让应用程序影响主机操作系统和FS。正如我向Eike提到的,我不想在浏览器中显示数据。应用程序的这一部分是完整的,工作正常。我想我会使用动态属性。我想我只需要弄清楚在加载.ui后如何读取它们。鉴于你是python大师,我可能应该询问更多细节ed在其他地方提出了问题。当然,请告诉我我的方法是否行不通,或者是否有更好的方法。浏览器是一个充满了陷阱和缓慢加载时间的雷区。我的应用程序的webapp版本适用于手机。我希望桌面有一个漂亮的界面。我不想在浏览器上浪费时间。我确实将应用程序的一部分实现为AJAX和酷炫的Dijits以及所有的jazz,它花费的时间大约是普通HTML表单的10倍。普通HTML表单用于手机,真正的桌面小部件。Javascript至少有一个工作沙盒机制。作为一个更简单的解决方案,您可以发送签名的Python代码,类似于Linux发行版。还有Pypy的沙盒解释器。谢谢你提供关于Pypy的信息。我会调查的。