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

Is it possible for Django to use the same link and a database for each client?

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

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

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

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

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

有没有人遇到过或者有解决的思路?我搜索了路由器,不知道能不能解决我的问题,或者切换连接和删除另一个客户端是否有同样的问题。

感恩

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

我想我解决了我的问题,我发现了一个对我很有用的 link:

dynamically set database based on request in django

它使用一个中间件来获取连接和路由器,正如回复的工作人员所提到的,在它使用子域的情况下,我对其进行了一些更改以获得已经解决我的情况的前缀,使用这个的帮助 link:

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()

感谢所有试图帮助我的人:)