Django - 运行时数据库切换

Mik*_*zco 9 django django-middleware django-models django-managers django-database

在我的工作中,我们希望运行具有多个数据库的服务器.当您访问类似http://myapp.webpage.com或的URL时,应该进行数据库切换http://other.webpage.com.我们只想运行一个服务器实例,并在HTTP请求时切换数据库并返回相应的响应.

我们一直在寻找一种可持续的"Django友好"解决方案.在我们的调查中,我们找到了可行的方法,但我们没有足够的信息.

选项1:Django中间件

每当服务器收到HTTP请求时,django中间件就会运行.

  1. 在这里进行数据库切换可能是最好的选择,但据我所知只使用django数据库路由器只允许更改模型或组或模型的数据库.

  2. 另一个选择是在中间件中设置django模型管理器实例,并强制所有模型objects从自定义中间件中的添加属性重新分配属性.

  3. 我的最后一个选择是在中间件接收的请求对象中创建一个新属性,返回database aliasfrom settings.py和在每个模型查询中使用using方法.

选项2:基于类的View Mixin

创建一个使用过去三个选项的mixin,但我必须在所有基于类的视图中设置mixin.如果程序员忘记设置mixin并且它来到生产服务器,那么数据可能(或停止在)正确的数据库中,我不想承担风险.

选项3:在运行时更改数据库设置

此选项有效,但不建议使用,风险太大.

更新:

这是怎么回事?

middlewares.py

import django.conf as conf
import os.path


class SelectDB(object):

    def process_request(self, request):
        print request.META['HTTP_REFERER']
        file_database = open("booklog/database.txt", "r")
        database = file_database.read(10)
        file_database.close()
        if database != 'default':
            conf.settings.DATABASES['default']['NAME'] = database
Run Code Online (Sandbox Code Playgroud)

任何有助于我们解决的信息将不胜感激.

Mik*_*zco 4

答案(对我有用)

这个问题已经在 stackoverflow 中得到了解答。我希望 django 中有这个功能。找到使这成为可能的方法有点困难。

我认为评论Wilduck使用 django 插件django-dynamic-db-router所做的伟大工作很重要,它是一个很棒的插件,可以以(有点)不同的方式实现此操作。

非常感谢@JL Peyret 和@ire_and_curses。

作为对@ire_and_curses 的回答。至少在此刻,在我正在工作的项目中,这是我们所需要的。在之前的项目中,我们需要类似的行为,并且每个实例只有一台服务器,这对于维护和更新每台服务器来说非常糟糕,甚至使该过程自动化也是如此。