【问题标题】:Accessing and sharing data between multiple sites in django from different databases从不同数据库访问和共享 django 中的多个站点之间的数据
【发布时间】:2026-01-30 18:05:01
【问题描述】:

目前我有三个站点,例如让它成为 site1、site2 和 site3。每个站点都需要身份验证。站点 1 和站点 2 都采用相同的数据库,使其成为“投资组合”数据库,而站点 3 具有不同的数据库,使其成为“站点 3 特定”数据库。

我计划建立一个通用帐户数据库,用于保存所有不同站点的用户登录凭据。这样每个站点(即站点 1、站点 2 和站点 3)都将使用通用帐户数据库来验证用户登录。我计划将用户详细信息保存在一个单独的数据库中,因为开发、测试和实时环境中的所有三个站点都可以共享相同的用户凭据而没有冗余。此外,每个站点可能都有自己的特定数据,我们在开发、登台和实时环境中可能拥有或输入的数据不同。

还有可能在站点之间共享一些数据。

谁能告诉我如何在 django + Apache + mod_wsgi 中完成这些任务。

请告知我是否需要全局共享设置文件、模型文件和 urls 文件。 IF 那么我的全局共享设置文件需要如何修改。请指教。

【问题讨论】:

  • Python2.6 + django 1.2.1 + Apache 2.2 + mod_wsgi
  • 是否可以选择使用 LDAP 后端进行用户身份验证/详细信息?从来没有用过 Django,但似乎有可能。
  • 嗨 Jasper,谢谢,是的,我没有尝试使用 ldap 服务器进行身份验证。我将尝试利用这个机会来实施它。在 Django 站点中是否有可能拥有多个共享数据库。请指教。

标签: django


【解决方案1】:

这就是我们目前的运作方式。

每个站点在httpd.conf 中都有自己的VirtualHost 条目,每个应用程序都有自己的 django.wsgi 配置文件,看起来像这样(您可能可以使用更简单的):

import os, sys, site, glob

prev_sys_path = list(sys.path) 

root_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
site.addsitedir(glob.glob(os.path.join(root_dir, 'venv/lib/python*/site-packages'))[0])
sys.path.append('/usr/local/django-apps')
sys.path.append('/usr/local/django-apps/AppName')

new_sys_path = [] 
for item in list(sys.path): 
    if item not in prev_sys_path: 
        new_sys_path.append(item) 
        sys.path.remove(item) 
sys.path[:0] = new_sys_path

os.environ['DJANGO_SETTINGS_MODULE'] = 'AppName.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

VirtualHost 需要包含这样的条目:

    SetEnv DJANGO_ENV ${environment
    WSGIDaemonProcess appname user=apache group=apache processes=2 threads=15 display-name=%{GROUP}
    WSGIProcessGroup appname
    WSGIScriptAlias / /usr/local/django-apps/AppName/apache/django.wsgi
    <Directory /usr/local/django-apps/AppName/apache>
            Order deny,allow
    </Directory>

从那里开始,数据库设置取决于您使用的数据库引擎。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    您必须查看您的要求,看看是否所有网站都可能需要,如果需要,请尊重单点登录 (sso) 服务。如果是这种情况,那么您可能需要查看会话是如何在站点之间传输的,因为会话是特定于 SITE_ID 的。因此,让它发挥作用可能是一个很好的开始,但在深入研究之前先看看大局可能是个好主意。

    【讨论】:

      【解决方案3】:

      我在这些站点中设置了相同的会话名称(a.xx.com/b.xx.com/c.xx.com -> 会话名称=xx.com)。在我的 Django 项目中,我为每个站点使用了三个设置文件,并使用 manager.py 来分隔这些站点。最后一步,分别启动它们。

      【讨论】: