在桌面上部署Django应用的成功方法有哪些?
我有一个Django应用程序,想把它部署到桌面上。我稍微了解了一下,发现一种方法是使用freeze。我以前在处理Python应用时用过这个,但效果不太稳定,所以我不太确定这是不是部署Django应用的最佳方法。
我想问的是:你们用过哪些成功的方法来部署Django应用?有没有什么普遍认可的标准方法?在这个过程中有没有遇到过什么困难?我需要一个可以在不同平台上都能用的解决方案。
2 个回答
如果你想要一个好的解决方案,就得放弃跨平台的想法。你的代码应该是可以移植的,但部署几乎必然需要针对特定平台。
我建议在Windows上使用py2exe
,在MacOS X上使用py2app
,而在Ubuntu上则可以构建deb
包,并在包的合适位置放一个.desktop
文件,这样用户的菜单里就能显示你的应用了。不幸的是,对于最后一种选择,没有方便的'py2deb'或'py2xdg'工具,但手动制作相关的文本文件其实也很简单。
当然,我还建议把Twisted作为你的网络服务器,这样可以让应用程序更容易自给自足 :).
几年前,我为一个在本地运行的Django应用做过这个。它是通过Twisted启动的,并用py2app打包成Mac应用和用py2exe打包成Windows应用。这个应用有浏览器和Air前端在使用。总体来说运行得还不错,但因为更大的项目被推迟了,我没能把它真正上线。时间过去了,我对细节有点生疏,不过这里有一些小建议:
如果我没记错,最麻烦的事情是Python加载C扩展。我有一个用C语言写的Intel汇编模块,需要加载它来获取低级系统数据。让它在两个平台上都能正常工作花了不少时间。如果可以的话,尽量避免使用C扩展。
你肯定需要一个安装程序。这个应用很可能会在后台运行,所以你需要把它标记为Windows服务、Unix守护进程或者Mac的launchd应用。
在你的安装程序中,你需要提供一种方法来找到一个空闲的本地TCP端口。你可能需要写一个小程序,让安装程序运行,或者使用安装程序自带的脚本功能来找到一个没有被占用的端口,并把它保存到配置文件里。然后在你的settings.py和你要部署的前端中加载这个配置文件。这个端口就是共享的。或者你也可以随便选一个数字,希望没有其他服务会和你冲突 :-)
如果你的前端和后端是分开的应用,那么你需要设计一个API让它们可以互相通信。确保提供一个标志,返回原始数据和人类可读的格式。这在调试时非常有帮助。
如果你想让Django能够发送通知给用户,你需要集成像Growl这样的工具,或者获取Python的Windows扩展,以便可以弹出通知。
你可能会想使用SQLite作为数据库,这样你需要确保使用信号量来处理多个请求争抢数据库(或其他共享资源)。如果用户通过浏览器访问你的应用,他们可能会同时打开多个窗口。如果使用自定义前端(本地应用、Air等),你可以控制在某个时间内运行的实例数量,这样就不会有太大问题。
你还需要某种方式访问本地系统日志,因为应用会在后台运行,确保捕获所有异常并将其记录到syslog中。调试Windows服务启动问题是个大麻烦,如果没有系统日志,这几乎是不可能的。
如果你想保持跨平台,注意不要硬编码路径。你可能需要依赖安装程序写入一个配置文件条目,记录实际的安装路径,然后在启动时加载它。
实际部署时一定要测试,尤其是在各种防火墙下。有些桌面防火墙会非常严格地阻止对接受入站请求的网络服务的访问。
我能想到的就这些了。希望对你有帮助。