2012-05-24 19 views
7

背景:我有5个独立的Django项目,我试图将它们合并到1个由多个应用程序组成的Django项目中。换句话说:projA有appA,projB有appB & projC有appC等。我想要1个masterProj有appA,appB & appC。在单个项目中为多个应用程序使用django用户身份验证和标记

当前每个应用程序连接到它自己的独立数据库(应用程序不共享数据)。每个项目都使用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不能从根本上支持的事情?

在此先感谢您的帮助!

+0

你为什么要合并它们?这听起来确实想让他们分开 - 即使认证表不共享。无论如何,你至少必须建立一个新的身份验证后端,它实际上在get调用中使用'using()'以及一个会话处理程序,它知道你登录了哪个应用程序......我的直觉告诉我这是非常未开发的领土。祝你好运! –

+0

我的最终目标是整合应用程序(意味着1个应用程序带有1个Django项目;目前很多应用程序共享通用代码)。但作为第一步,我想我会把它们全部合并为一个项目;然而,这比我想象的要困难得多。谢谢(你的)信息! – jewelia

+0

嗯有趣。也许你可以开始通过处理默认数据库中的身份验证来处理该项目,因为它将在最终的组合产品中进行处理?如果您想出一个auth接口,可以处理站点不同部分的单独登录,那么当您结合数据库时,您的代码不必从中间阶段(5应用程序)更改为最终(1应用程序)!另外一个提示:如果你将你的认证问题和标签问题分开,你可能会得到更多的帮助。 –

回答

1

Django的架构设计为围绕Django项目和多个Django应用程序。该项目本身不过是您的设置和主URL配置模块,而应用程序是遵循几个文件约定的简单包。

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

这对于大型项目以及当您想要搭配和合并几个重复使用类似设计和方法的不同项目都很有效。虽然这只会影响项目的结构,但选择是否为单个Django项目或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模块,引用不同的应用并揭露不同的行为。对于每个项目数据库设置,您已经重新使用代码并同时为每个项目保留数据库数据和状态。

+0

原谅我密集,但我真的不明白这是如何解决OP的问题...可以你澄清一点? –

相关问题