Django是否可以为每个客户端使用相同的链接和数据库?

时间:2018-06-06 17:06:39

标签: python django django-2.0

Django是否可以为每个客户端使用相同的链接和数据库?

您好,我是Django的新手,我有一个问题。 我将一个PHP系统带到Django,其中所有客户端使用相同的链接访问系统,但每个客户端都有其用户,访问组等数据库。 在自定义登录屏幕中,他们通知客户端ID,用户和密码进行身份验证,客户端ID始终是数据库的名称。

我制作了以下代码来更改可能错误的数据库连接:

def change_db (self):
    connections ['default']. settings_dict ['NAME'] = self.db
    return True

代码甚至会交换我想要访问的数据库,但是使用runserver在我的本地机器上进行测试,如果另一个客户端同时访问,例如在另一个浏览器中,则会替换另一个客户端。

有没有人拥有它或者有想法要解决?我搜索了路由器,我不知道是否能解决我的问题,或者是否存在切换连接和删除其他客户端的相同问题。

荷。

2 个答案:

答案 0 :(得分:1)

我想我解决了我的问题,发现了一个对我非常有用的链接:

dynamically set database based on request in django

它使用中间件来获取响应人员所提到的连接和路由器,在使用子域的情况下,我对它进行了一些更改,以借助已经解决了我的情况的前缀。此链接:

Django URL with dynamic prefix

遵循代码:

from django.utils.deprecation import MiddlewareMixin
from django.contrib.sessions.middleware import SessionMiddleware
import re
import threading 

request_cfg = threading.local()

#Middleware
class RouterMiddleware(MiddlewareMixin):

    def process_request(self, request):
        words = request.get_full_path()
        db_name = words.split('/')[1]
        request_cfg.cfg = db_name
        return None

    def process_view(self, request, view_func, view_args, view_kwargs):
        cliente = view_kwargs.get('cliente')
        if cliente:
            request.cliente = cliente
            view_kwargs.pop('cliente')
            return view_func(request, *view_args, **view_kwargs)

    def process_response(self, request, response):
        if hasattr(request_cfg, 'cfg'):
            del request_cfg.cfg
        return response

#Router
class DatabaseRouter (object):
    def _default_db(self):
        if hasattr(request_cfg, 'cfg'):
            return request_cfg.cfg
        else:
            return 'default'

    def db_for_read(self, model, **hints):
        return self._default_db()

    def db_for_write(self, model, **hints):
        return self._default_db()

感谢任何试图帮助我的人:)

答案 1 :(得分:-1)

根据文档,您不应该在运行时编辑settings.py,但是 你试过this吗?