Django是否可以为每个客户端使用相同的链接和数据库?
您好,我是Django的新手,我有一个问题。 我将一个PHP系统带到Django,其中所有客户端使用相同的链接访问系统,但每个客户端都有其用户,访问组等数据库。 在自定义登录屏幕中,他们通知客户端ID,用户和密码进行身份验证,客户端ID始终是数据库的名称。
我制作了以下代码来更改可能错误的数据库连接:
def change_db (self):
connections ['default']. settings_dict ['NAME'] = self.db
return True
代码甚至会交换我想要访问的数据库,但是使用runserver在我的本地机器上进行测试,如果另一个客户端同时访问,例如在另一个浏览器中,则会替换另一个客户端。
有没有人拥有它或者有想法要解决?我搜索了路由器,我不知道是否能解决我的问题,或者是否存在切换连接和删除其他客户端的相同问题。
荷。
答案 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吗?