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()
感谢所有试图帮助我的人:)
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()
感谢所有试图帮助我的人:)