使用传统的web开发技术,也就是html+js,然后搭配一个后端语言,已经成为当今web开发的固定模式了,为此也形成了众多的toolkit,譬如ror,django,各种js图形库更是玲琅满目,从很大程度上也加速了开发过程.但传统web应用也很自然地有一些诟病,有些特殊效果,c端可以轻而易举地完成,但b端就会很纠结了,从根本上讲,这是因为html这种语言是内容驱动行为的服务模式,导致js没有状态保留的功能,这在我和我的同事使用webkit结合html+js来搭建一个hybrid应用的时候让我深有体会.后来在进行一些类似tableview的内容展示的时候,已经完全hold不住了,在c端里面最普通的mvc模式就可以解决的问题,在b端里面得用js来做异步数据分段请求,还有很多坑爹的东西已经不记得了,后来经过几天的评估,还是决定推倒重来,我们之所以要用web来做ui,或者说一些简单的逻辑,主要是我们既需要高的实时内容分发也需要高的开发效率,毕竟这些都是一个走流程的东西,用c/c++来做太大材小用了.我们团队一直是用的python来做这些以上的工作,但这次没有用,因为我们不想开放原始码(别提pyc什么的,跟原始码有多大区别?),二个内容的实时分发能力跟不上,就好比我们需要给用户展示一个类似网站一样的应用,我们希望用户可以实时的得到我们最新的软体功能的推送.想了很久,最终得出一个结论:我们需要像html+js一样使用python,那就一切问题都迎刃而解了.
故事从python的import机制说开去,阅读了(python import system)https://docs.python.org/3.5/reference/import.html和相关的pep之后,觉得这个做法可行,然后就实现了一个可以导入网络包的机制,比如有一个py放在我们website的rs.sysfix.cn/demo/pong.py,那如下导入即可:import rs.sysfix.cn.demo.pong as pong,之后的使用就和普通的py一模一样了,当然,这样还不够,如果别人直接访问这个url,就可以得到原始码了,再加一点东西,我们用aes把代码给跑一遍之后再放到服务器上,然后本地的import机制中解密之后再执行,当然,实际上我们还压缩了,毕竟网络io比cpu资源更宝贵.这个import的机制使用一个py实现的,他必须是在应用软件本地可接触到的,意思就是如果用户刻意去留意这个脚本,然后顺藤摸瓜,那我们的工作还是白做了,好,让我们再疯狂一点,用c来实现这个import的机制,这样本地只需要载入这个c的dll或者其他你喜欢的方式,就可以拥有一个可以载入自己服务器上压缩加密的py包的执.行环境了.到了c的世界,那保护起来就有无穷无尽的想象了,加壳,花指令......
可能咱们说得不是太清楚,有同学不太明白这样做的意义,这个web的方式和传统的web2py等是不同的,这些py代码是在客户端执行的,服务器只是提供一个脚本的地方,就像js一样,但他跟js又不一样,他是一个纯粹的python环境,你可以通过ctype调用dll和系统api,通过urllib发起http连接,使用pyqt搭建native ui,使用numpy做数值计算,用pygame编写游戏.
我们下一步的计划是开发一个拥有这种机制的浏览器,它不仅可以访问传统的html网站,使用这种机制搭建的py网站也可以访问,应该是很有趣的,到时候项目会发起在github,敬请关注.
因为最近项目繁忙,代码等有空整理出来开放以飨读者.以上机制可以参考我们团队的这个产品看到这个技术的成果:http://www.sysfix.cn/windowschanpin/shujuhuifu/gaoqingshipinleihuifu/2014/0106/567.html