背景:我有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不能从根本上支持的事情?
在此先感谢您的帮助!
你为什么要合并它们?这听起来确实想让他们分开 - 即使认证表不共享。无论如何,你至少必须建立一个新的身份验证后端,它实际上在get调用中使用'using()'以及一个会话处理程序,它知道你登录了哪个应用程序......我的直觉告诉我这是非常未开发的领土。祝你好运! –
我的最终目标是整合应用程序(意味着1个应用程序带有1个Django项目;目前很多应用程序共享通用代码)。但作为第一步,我想我会把它们全部合并为一个项目;然而,这比我想象的要困难得多。谢谢(你的)信息! – jewelia
嗯有趣。也许你可以开始通过处理默认数据库中的身份验证来处理该项目,因为它将在最终的组合产品中进行处理?如果您想出一个auth接口,可以处理站点不同部分的单独登录,那么当您结合数据库时,您的代码不必从中间阶段(5应用程序)更改为最终(1应用程序)!另外一个提示:如果你将你的认证问题和标签问题分开,你可能会得到更多的帮助。 –