什么是打包Django应用程序的好方法?

5
我有一个Django项目,客户会在他们的服务器上安装。我还有一些可选的应用程序,它们是功能插件,可以随意安装/卸载。
我希望有一种简单的方法来打包这些插件应用程序,使得安装/卸载变得轻松。我不希望他们将模板文件复制到一个目录,将应用程序放到另一个目录,媒体文件放到第三个目录等等。如果他们不需要编辑settings.py,那就更好了,但是如果确实需要,也可以接受。
理想情况是,他们只需解压缩到Python路径中的某个位置(可能是特殊的插件目录),并删除以卸载。是否有一种简单的方法来打包这些应用程序,以便可以通过这种方式进行安装?
2个回答

4
我将跳过Python打包(distutils、setuptools、pip等)的讨论,因为您似乎更喜欢使用简单的zip文件或tarballs。我将逐一解决您提到的“痛点”:
模板文件:只要在项目的TEMPLATE_LOADERS设置中包含'django.template.loaders.app_directories.load_template_source',您就不必担心这个问题。每个应用程序都可以有一个“templates/”子目录,其中的模板将被加载,就像它们在项目范围内的模板目录中一样。
媒体文件:应用程序媒体是一个麻烦事。对于开发,您可以使用类似于app_directories模板加载器的自定义serve_media视图(在每个应用程序中查找媒体)。在生产中,您必须复制文件、使用符号链接或使用Web服务器级别的别名。有几个实用程序应用程序试图平滑处理这个问题;我现在使用django-staticfiles编辑settings.py:没有简单的方法。为了让模型、模板标签、管理命令等工作,必须将应用程序列在INSTALLED_APPS中。您可以在settings.py中编写一些自定义代码,列出某个目录的内容,并动态地将其找到的包添加到INSTALLED_APPS中。这有点危险(请仔细考虑谁有权限将文件放置在该目录中,因为他们拥有您的密钥),并且只有在服务器重新加载时才能检测到新文件,但它应该可以工作。
我认为如果您组合使用这些解决方案,就可以实现您的理想情况:解压以安装,删除以卸载。

感谢提供Django-Media-Utils的链接。这真是机制中最大的痛点。希望我们也可以指定多个媒体目录。我想动态添加到INSTALLED_APPS也是一种选择。由于需要访问服务器来放置插件,安装人员无论如何都可以访问所有文件。您之前尝试过这样吗? - Siddhi
不,我从来没有尝试过动态的INSTALLED_APPS设置。从概念上讲,并没有太复杂的东西。实际上,一个麻烦可能是每次在插件目录中添加/删除应用程序时都需要重新启动生产Web服务器。此外,如果插件应用程序可以包含模型,你需要制定一个必要的syncdb计划。 - Carl Meyer

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接