【问题标题】:django -- application subdirectory site/app1/app2/app3django -- 应用程序子目录 site/app1/app2/app3
【发布时间】:2010-10-29 22:13:40
【问题描述】:

如果你要为一个网站编写一个应用程序,但想让应用程序即插即用,这样你就可以把它放到任何 Django 项目中,设置主 URL 就可以了,如果你愿意,你会怎么做将所有其他必需的实用程序应用程序包含在您的便携式应用程序中。

例子:

site/
site/site-app1
site/templates/site-app1
site/util-app1
site/util-app2
site/util-app3

注意:site-app1 使用了所有三个 util-apps。它以这种方式工作得很好。但是现在,您决定将应用程序发送给某人,但只是发送给该应用程序及其所有依赖项。

如果我们可以像这样打包和发送应用程序?:

site/site-app1
site/site-app1/template
site/site-app1/util-app1
site/site-app1/util-app2
site/site-app1/util-app3

然后您只需发送 site-app1,一切都会随之而来。

有没有办法将实用程序应用程序作为子目录进行移植?

注意:我们的想法是我们不想发送整个项目,而是发送一个站点应用程序 仅限项目。

【问题讨论】:

    标签: django web-applications django-urls


    【解决方案1】:

    有一些关于可重用 django 应用程序的演示文稿,所以请四处搜索。这些应该可以帮助您:

    【讨论】:

    • 仅供参考,对于未来的读者,可以在 b-list Pycon 2008 reusable-apps.pdf 找到 .pdf。给定的 .pdf 链接似乎已过期或被覆盖(主页重定向到 2011 年链接)。我猜 2008 年只是 最后十年 :) 真的,谁会想要整整三年 前的数据?
    【解决方案2】:

    @Gerry 链接到的演示文稿是很好的一般信息来源。为了更直接地回答你的问题,没有办法将一个应用程序打包到另一个应用程序中编辑抱歉,这完全是错误的。你可以把一个应用程序在另一个人的命名空间内,它工作得很好。虽然这是一件奇怪的事情:你暗示一个应用程序是另一个应用程序的一部分;如果这是真的,它们会更容易用作单个应用程序.所以我仍然推荐以下选项之一)。 AFAICT 你的选择是:

    1. 如果可能,将这些外部依赖项设为可选(即,如果 util_app1 可用,则增强功能,如果不可用,则回退行为)。这是关于 django-tagging 或 django-mailer 的应用程序的数量。

    2. 将所有功能整合到一个应用程序中。根据您实际依赖实用程序应用程序的代码量,如果依赖项对于您的应用程序运行是绝对必要的,那么这可能是让您的用户轻松使用的最佳选择。

    3. 分别打包和分发所有应用程序,并注意文档和 setup.py install_requires 中的依赖关系。如果所有应用程序都是独立有用的,那么这种方法可能是最好的。如果它们都不是独立有用的,为什么它们都是独立的应用程序?

    【讨论】:

    • 好吧,我有一个没有视图的应用程序,它只是提供位置信息。其他应用程序使用它,所以我需要将它放在任何其他应用程序之外。但是,如果我需要向某人发送一个使用 Location 应用程序的应用程序,现在我必须向他发送两个应用程序。另一个原因是,我有一个简单的实用函数,可以对字符串执行 X 操作。因此,我无法将字符串实用程序复制到所有应用程序中,我必须将其保留,但现在存在依赖项。所以,事情并不像看起来那么简单。
    • 这从来都不是简单的 ;-) 如果您想打包应用程序以进行通用重用,那么您的想法必须与编写它们以用于特定项目时有所不同。有时在最简单/最高性能/DRY 和允许通用重用之间进行权衡。但是,如果没有看到代码细节,很难给出更具体的评论。
    【解决方案3】:

    Django 应用程序可以通过遵循某些实践来实现可移植性。当然,这些不是强制性的

    申请地点

    惯例是在apps/目录中添加应用程序,并修改manage.py(最终是apache配置)以包含

    import sys
    from os.path import abspath, dirname, join
    PROJECT_ROOT = abspath(dirname(__file__))
    sys.path.insert(0, join(PROJECT_ROOT, "apps"))
    

    您的目录结构将类似于

    site
    site/apps/
    site/apps/app1/
    site/apps/app2/
    

    模板

    模板位于应用程序的模板目录中。惯例是不强制用户将它们复制到任何其他位置。最终,用户可以拥有全局模板来覆盖应用程序中的模板。

    设置

    将所有默认设置保存在应用目录内的本地文件中。这些设置将被全局设置覆盖。本地设置文件将具有以下结构..

    from django.conf import settings
    
    def get(key, default):
        return getattr(settings, key, default)
    
    SETTING_1 = get('SETTTING_1', 10)
    

    这些约定应涵盖大多数主要问题。

    【讨论】:

    • 快速问题:1-我们可以把Apps目录放在python路径上吗? manage.py 或 Apache 配置更改需要什么?这可以通过设置 PYTHONPATH 来完成吗? 2-我了解应用程序目录中需要一个本地设置文件,但为什么它会被全局设置文件覆盖?我想我不明白你的“设置”解释中的代码。谢谢
    • 当然你可以改变 PYTHONPATH。我从约定的角度提到了manage.py..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 2015-02-13
    • 1970-01-01
    • 2019-04-14
    相关资源
    最近更新 更多