在我的工作中,我们希望运行具有多个数据库的服务器。当您访问http://myapp.webpage.com
或http://other.webpage.com
等网址时,应进行数据库切换。我们只想运行一个服务器实例,并在HTTP请求时切换数据库并返回相应的响应。
我们一直在寻找一个可持续的和Django友好的'解。在我们的调查中,我们发现了可能的方法,但我们没有足够的信息。
每次服务器收到HTTP请求时都会运行django中间件。
在这里进行数据库切换可能是最好的选择,但据我所知,仅使用django database routers只允许更改模型或组或模型的数据库。
另一种选择是在中间件中设置django model manager实例,并强制所有模型从自定义中间件中添加的属性重新分配objects
属性。
我的最后一个选择是在中间件收到的请求对象中创建一个新属性,该对象从database alias
返回settings.py
,并在每个模型查询中使用using method。
创建一个使用过去三个选项的mixin,但我必须在所有基于类的视图中设置mixin 。如果程序员忘记设置mixin并且它来到生产服务器,那么数据可能(或不再存在)在正确的数据库中,我也不想承担风险。
此选项有效但Is not recommended并且风险太大。
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
非常感谢任何有助于我们解决的信息。
答案 0 :(得分:3)
问题已经回答here, in stackoverflow。我喜欢这个功能在django。找到实现这一目标的方法有点困难。
我认为评论Wilduck使用django插件django-dynamic-db-router所做的出色工作非常重要,这是一个很棒的插件,可以(以某种方式)以不同的方式实现此操作。
非常感谢@JL Peyret和@ire_and_curses。
作为@ire_and_curses的答案。至少在这一刻,在项目中,我正在努力,这就是我们所需要的。在以前的项目中,我们需要一个类似的行为,并且每个实例使一台服务器变得非常糟糕,并且更新每台服务器,甚至使该过程自动化。