7

背景:我有 5 个独立的 Django 项目,我试图将它们组合成 1 个由多个应用程序组成的 Django 项目。换句话说:projA 有 appA,projB 有 appB,projC 有 appC,等等。我想要 1 个 masterProj,它有 appA、appB 和 appC。

目前每个应用程序都连接到它自己的独立数据库(应用程序不共享数据)。每个项目都使用 Django 用户认证、Django 注册、taggit、profiles、comments 和 sorl-thumbnail。

我正在使用 Django 1.4 并根据这个 stackoverflow 答案设置数据库路由,这样,一旦组合到一个项目中,新组合的 Django 项目中的每个应用程序仍然能够连接到自己的数据库。进展顺利,但我开始遇到用户身份验证和 taggit 之类的问题:

1)如前所述,每个应用程序连接到不同的数据库,每个数据库都有一个名为“auth_user”的表。但是,我发现对 auth_user 表的所有读/写调用(无论哪个应用程序进行读/写调用)都被路由到默认数据库(在本例中为 appA 的数据库):

# settings.py:
DATABASES['default'] = DATABASES['appA']
DATABASE_ROUTERS = ['appA.db.DBRouter', 'appB.db.DBRouter', 'appC.db.DBRouter']

# appA/dbrouterA.py (appB, appC routers are identical this, replacing 'appA' with 'appB', etc.)
class DBRouter(object):
    def db_for_read(self, model, **hints):
        if model._meta.app_label == 'appA':
            return 'appA'
        if model._meta.app_label == 'auth':
            return 'appA'
        return None

    def db_for_write(self, model, **hints):
        if model._meta.app_label == 'appA':
            return 'appA'
        if model._meta.app_label == 'auth':
            return 'appA'
        return None

2) 假设我让路由正常工作,如果用户登录 appA,我不希望他们登录 appB。我看到很多人发布了相反的问题(他们希望他们的应用程序共享用户凭据),但是有没有人在同一个项目的多个独立应用程序中成功使用 Django 用户身份验证?如果是这样,你是怎么做到的?

3)我的 taggit 代码出现以下错误,但我无法弄清楚如何将“related_name”参数传递给 taggit。我正在使用 taggit 的基本实现 - 没有子类化任何东西:

# appA/models.py
tags = TaggableManager(blank=True)

# appB/models.py
tags = TaggableManager(blank=True)

错误:

appA.userprofile: Accessor for m2m field 'tagged_items' clashes with related m2m field 'TaggedItem.userprofile_set'. Add a related_name argument to the definition for 'tagged_items'.
appB.userprofile: Accessor for m2m field 'tagged_items' clashes with related m2m field 'TaggedItem.userprofile_set'. Add a related_name argument to the definition for 'tagged_items'.

4)我开始觉得结合所有这些应用程序是一个滑坡;稍后我可能会遇到 sorl-thumbnail 或尚未出现的评论的问题。有没有人成功地将应用程序合并到一个项目中?还是我试图做一些 Django 根本不支持的事情?

在此先感谢您的帮助!

4

1 回答 1

1

Django 的架构旨在围绕一个 Django 项目和几个 Django 应用程序展开。项目本身只不过是您的设置和主 URL 配置模块,而应用程序是遵循一些文件约定的简单包。

现在,应用程序本身永远不会与特定项目耦合(尽管它们可以通过引用它们来耦合到其他应用程序)。这个想法是让您保留设计项目源代码结构的自由,并且对于大多数 Django 项目来说,一种常见的方法是在项目的顶级包下分发 Django 应用程序,就像大多数 Python 应用程序一样。这种方法可以方便地获得项目提供的所有功能的整体视图(当您应用有意义的应用程序标签时),创建名称空间并为开发人员提供访问特定项目源的便捷且有组织的路径。

这对于大型项目以及当您想要并置和合并多个重复使用相似设计和方法的不同项目时都非常有用。虽然这只会影响您的项目的结构,但选择是为单个 Django 项目配置还是为固定的 Django 应用程序集配置多个 Django 项目有一些重要的影响。

当您创建一个 Django 项目时,您基本上将 Django 应用程序插入到框架的工具中并公开应用程序行为,正如我们在 Web 应用程序中所理解的那样,通过配置和包含来自您的 Django 应用程序的 URL 和视图的映射模式。

关键是您可以以任何适合您的方式重新组织资源。你的包可以组织成proj.appA, proj.appB, 等或proj.common1, proj.common2, proj.projA.app1, proj.projA.app2, proj.projB.app1,这完全取决于你。

您应该知道的是,您不需要单一的设置和 URL 模块,而是求助于数据库路由和管理数据库连接,您也可以为每个项目设置一个设置和 URL 模块,它们引用不同的应用程序并公开不同的行为. 使用每个项目的数据库设置,您已经重用代码并同时为每个项目保持数据库数据和状态不同。

于 2012-06-09T15:15:03.930 回答