【问题标题】:What is a good way to package django apps?打包 django 应用程序的好方法是什么?
【发布时间】:2009-08-28 18:05:35
【问题描述】:

我有一个 django 项目,由客户安装在他们的服务器上。我还有一些应用程序是可以安装/卸载的可选功能插件。

我想要一种简单的方法来打包这些插件应用程序,以使安装/卸载变得轻松。我不希望他们将模板文件复制到一个目录,将应用程序复制到另一个目录,将媒体复制到第三个目录,依此类推。我希望他们不需要编辑 settings.py,但如果无法帮助也可以。

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

【问题讨论】:

    标签: django packaging


    【解决方案1】:

    我将跳过有关 Python 打包(distutils、setuptools、pip 等)的讨论,因为听起来您更喜欢使用简单的 zip 文件或 tarball。我将一次解决您提到的“痛点”:

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

    媒体文件:应用媒体很麻烦。对于开发,您可以使用与 app_directories 模板加载器类似的操作的自定义 serve_media 视图(在每个应用程序中查找媒体)。在生产中,您必须复制文件、使用符号链接或使用网络服务器级别的别名。有几个实用应用程序试图解决这个问题。我现在使用django-staticfiles

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

    我认为,如果您将这些解决方案放在一起,就有可能实现您的理想情况:解压缩安装,删除卸载。

    【讨论】:

    • 感谢 djano-media-utils 的链接。这是机制中最大的痛苦。希望我们也可以指定多个媒体目录。我想动态添加到 INSTALLED_APPS 是一种选择。由于您需要访问服务器来放置插件,因此安装人员无论如何都可以访问所有文件。你以前试过这个吗?
    • 不,我从未尝试过动态 INSTALLED_APPS 设置。在概念上没有什么太复杂的。在实践中,一个麻烦可能是在插件目录中添加/删除应用程序时需要重新启动生产 Web 服务器。此外,如果插件应用程序可以包含模型,您需要一个计划来实现必要的同步数据库。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-08
      • 2021-05-19
      • 2015-07-27
      • 1970-01-01
      • 1970-01-01
      • 2010-09-08
      相关资源
      最近更新 更多