使用django用户身份验证&用于单个项目中多个应用的​​taggit

时间:2012-05-24 21:52:55

标签: python django django-taggit

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

目前,每个应用程序都连接到自己的独立数据库(应用程序不共享数据)。每个项目都使用Django用户身份验证,Django注册,taggit,配置文件,注释和sorl-thumbnail。

我正在使用Django 1.4并设置database routing according to this stackoverflow answer,这样,一旦合并到一个项目中,新组合的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没有从根本上支持的事情?

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

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

现在,应用程序本身永远不会耦合到特定项目(尽管可以通过引用它们将它们耦合到其他应用程序)。我们的想法是允许您保留设计项目源结构的自由,并且大多数Django项目都采用一种方法,即在大多数Python应用程序的项目顶层包中分发Django应用程序。这种方法可以方便地获得项目提供的所有功能的整体视图(当您应用有意义的应用程序标签时),创建名称空间并为开发人员提供方便且有条理的访问特定项目源的途径。

这对于大型项目以及当您想要并置和合并多个重复使用类似设计和方法的不同项目时都很有效。虽然这只会影响项目的结构,但是选择是否为单个Django项目配置一个配置,或者为您的固定Django应用程序设置几个Django项目会产生一些重要的后果。

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

重点是您可以以任何适合您的方式重新组织来源。您的软件包可以按proj.appAproj.appB等或proj.common1proj.common2proj.projA.app1proj.projA.app2proj.projB.app1进行整理。 ,这完全取决于你。

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