我有一个Django应用程序,我想部署到桌面。我已经阅读了一点,看到一种方法是使用freeze。我过去在Python应用程序中使用过这种方法取得了不同的成功,但我不相信它是Django应用程序的最佳方法。
我的问题是:您用于部署Django应用程序的成功方法是什么?有事实上的标准方法吗?你有没有死路一条?我需要一个跨平台的解决方案。
答案 0 :(得分:6)
几年前我为一个运行本地守护进程的Django应用做了这个。它由Twisted发布,由py2app for Mac和py2exe for Windows包装。有一个浏览器和一个Air前端击中它。它在大多数情况下工作得很好,但我没有在野外部署它,因为较大的项目被推迟了。已经有一段时间了,我对细节有点生疏,但这里有一些提示:
IIRC,最有问题的是Python加载C扩展。我有一个用C“asm”命令编写的英特尔汇编程序模块,我需要加载它来获取低级系统数据。这需要一段时间才能在两个平台上运行。如果可以,请尽量避免使用C扩展名。
您肯定需要安装程序。该应用最有可能最终在后台运行,因此您需要将其标记为Windows服务,Unix守护程序或Mac启动应用程序。
在安装程序中,您需要提供一种查找空闲本地TCP端口的方法。您可能必须编写安装程序运行的小存根例程,或使用安装程序的内置脚本工具来查找尚未执行的端口并将其保存到配置文件中。然后,在settings.py中加载配置文件,以及要部署的任何前端。那是共享端口。或者你可以选择一个随机数字,并希望桌面上的其他服务没有你的脚趾: - )
如果您的前端和后端是单独的应用,那么您需要设计一个API,让他们互相交流。确保提供一个标志,以原始和人类可读的形式返回数据。它确实有助于调试。
如果您希望Django能够向用户发送通知,您可能希望与Growl集成或获取Python for Windows扩展,以便您可以调出烤箱弹出通知。
您可能希望坚持使用SQLite for database,在这种情况下,您需要确保使用信号量来处理争夺数据库(或任何其他共享资源)的多个请求。如果您的应用程序是通过浏览器访问的,则用户可以打开多个窗口并同时点击该应用程序。如果使用自定义前端(本机,Air等等),那么您可以控制在给定时间运行的实例数,因此不会出现问题。
您还需要对本地系统日志记录工具进行某种访问,因为应用程序将在后台运行,并确保捕获所有异常并将其路由到syslog中。一个很大的麻烦是调试Windows服务启动问题。没有系统记录就不可能。
如果您希望保持跨平台,请注意硬编码路径。您可能必须依赖安装程序来编写配置文件条目,其中包含您在启动时必须加载的实际安装路径。
特别是在各种防火墙上测试实际部署。一些桌面防火墙非常积极地阻止访问接受传入请求的网络服务。
这就是我所能想到的。希望它有所帮助。
答案 1 :(得分:4)
如果你想要一个好的解决方案,你应该放弃跨越平台。您的代码应该都是可移植的,但您的部署 - 几乎按定义 - 需要特定于平台。
我建议在Windows上使用py2exe
,在MacOS X上使用py2app
,并在包装中的正确位置使用.desktop
文件为Ubuntu构建deb
个包一个条目显示在用户的菜单中。不幸的是,对于最后一个选项,没有方便的'py2deb'或'py2xdg',但是手动制作相关的文本文件非常容易。
当然,我建议在Twisted as your web server中捆绑使应用程序轻松自包含:)。