在单个项目中为多个应用程序使用Django用户身份验证和taggit

2024-04-23 07:57:07 发布

您现在位置:Python中文网/ 问答频道 /正文

背景:我有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根本不支持的事情?在

提前感谢您的帮助!在


Tags: 项目django用户auth数据库应用程序fordb
1条回答
网友
1楼 · 发布于 2024-04-23 07:57:07

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

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

无论是大型项目,还是当您想要并置和合并多个不同的、重用相似设计和方法的项目时,这都非常有用。虽然这只会影响项目的结构,但是选择是否为一个Django项目配置,还是为固定的Django应用程序设置几个Django项目都会产生一些重要的影响。在

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

关键是你可以用任何对你有用的方式重新组织源代码。你的软件包可以像proj.appAproj.appB等等,或者proj.common1proj.common2proj.projA.app1proj.projA.app2proj.projB.app1,这完全取决于你自己。在

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

相关问题 更多 >