2009-08-28 63 views
5

我有一个由客户在其服务器上安装的django项目。我还有几个应用程序是可以安装/卸载的可选功能插件。什么是包装Django应用程序的好方法?

我想一个简单的方法来包装这些插件的应用程序,使安装/卸载无痛。我不希望他们将模板文件复制到一个目录,将应用程序复制到另一个目录,将介质复制到另一个目录,等等。我宁愿他们不需要编辑settings.py,尽管如果它不能被帮助,它也可以。

理想的情况是,如果他们可以简单地解压缩到python的路径(可能是特殊的插件目录?)上的位置,并删除它卸载。有没有简单的方法来打包应用程序,以便可以这样安装它们?

回答

4

我会跳过Python打包(的distutils,setuptools的,画中画等)的讨论,因为它听起来就像你更喜欢使用简单的zip文件或压缩包。我会解决“痛点”,你提到一次一个:

模板文件:只要你有“django.template.loaders.app_directories.load_template_source”包含在你的项目的TEMPLATE_LOADERS设置,你不应该担心这个。每个应用程序都可以有一个“templates /”子目录,其中的模板将被加载,就像它们在您的项目范围的模板目录中一样。

媒体文件:应用介质是一种痛苦。对于开发,您可以使用与app_directories模板加载器类似的自定义serve_media视图(在每个应用程序中查找媒体)。在生产中,您必须复制文件,使用符号链接或使用Web服务器级别别名。有几个实用程序应用程序试图缓解这个问题;我现在使用django-staticfiles

编辑settings.py:围绕这一没有简单的方法。要使其模型,模板标签,管理命令等起作用,必须在INSTALLED_APPS中列出应用程序。你可以做的是在settings.py中写一些自定义代码,它列出了某个目录的内容,并动态地将它找到的包添加到INSTALLED_APPS。有点危险(仔细考虑谁有权将文件放在该目录中,因为他们有你的王国的钥匙),并且只有在服务器重新加载时才能检测到新文件,但它应该可以工作。

我认为,如果你放在一起这些解决方案,它可以实现你理想的情况:解压安装,删除卸载。

+0

感谢您链接到djano-media-utils。那是机制中最大的痛苦。希望我们也可以指定多个媒体目录。 我想动态地添加到INSTALLED_APPS是一个选项。由于您需要访问服务器以放置插件,因此他们安装人员可以访问所有文件。你以前试过这个吗? – Siddhi 2009-08-29 04:30:32

+0

不,我从来没有试过动态的INSTALLED_APPS设置。在概念上,没有太复杂的东西。在实践中,有一个问题可能是需要在插件目录中添加/删除应用程序时重新启动生产Web服务器。另外,如果插件应用程序可以包含模型,则需要制定必要的syncdb计划。 – 2009-08-29 14:27:14

0

编辑settings.py:您的插件可以从自己的设置文件读取其设置在自己的目录中。他们只需要编辑根settings.py以从“INSTALLED_APPS”添加/删除插件路径。

相关问题