背景:我有5个独立的Django项目,我正试图将它们组合成一个由几个应用程序组成的Django项目。换句话说:projA有appA,projB有appB,projC有appC,等等。我想要一个主proj,有appA,appB和appC。在
目前每个应用程序都连接到自己的独立数据库(应用程序不共享数据)。每个项目都使用Django用户身份验证、Django注册、taggit、配置文件、注释和sorl缩略图。在
我使用的是django1.4和setupdatabase 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的基本实现-没有子类化任何东西:
^{pr2}$错误:
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缩略图的问题,或者还没有出现的评论。是否有人成功地将应用程序组合到一个项目中?或者我是想做一些Django根本不支持的事情?在
提前感谢您的帮助!在
Django的架构是围绕一个Django项目和几个Django应用程序而设计的。项目本身只不过是您的设置和主URL配置模块,而应用程序是遵循一些文件惯例的简单包。在
现在,应用程序本身永远不会耦合到某个特定的项目(不过,它们可以通过引用它们来耦合到其他应用程序)。这样做的目的是让您保留设计项目源代码结构的自由,而对于大多数Django项目来说,一种常见的方法是将Django应用程序分发到项目的顶级包下,就像大多数Python应用程序一样。这种方法可以方便地获得项目提供的所有功能的整体视图(当您应用有意义的应用程序标签时),从而创建名称空间,并为开发人员提供了一个方便而有组织的访问特定项目源的路径。在
无论是大型项目,还是当您想要并置和合并多个不同的、重用相似设计和方法的项目时,这都非常有用。虽然这只会影响项目的结构,但是选择是否为一个Django项目配置,还是为固定的Django应用程序设置几个Django项目都会产生一些重要的影响。在
当您创建一个Django项目时,您基本上是将Django应用程序插入到框架的工具中,并通过配置和包含Django应用程序中url和视图的映射模式来公开应用程序行为,正如我们在Web应用程序中所理解的那样。在
关键是你可以用任何对你有用的方式重新组织源代码。你的软件包可以像
proj.appA
,proj.appB
等等,或者proj.common1
,proj.common2
,proj.projA.app1
,proj.projA.app2
,proj.projB.app1
,这完全取决于你自己。在你应该知道的是,你不需要一个单一的设置和URL模块,并求助于数据库路由和管理数据库连接,你可以为每个项目有一个设置和URL模块,它引用不同的应用程序和暴露不同的行为。对于每个项目的数据库设置,您已经在重用代码并同时为每个项目保持不同的数据库数据和状态。在
相关问题 更多 >
编程相关推荐