【发布时间】:2020-07-03 21:56:00
【问题描述】:
我正在尝试解决一些对我来说相当困难的事情,而用户界面让我非常头疼。
我想要一个拥有多个数据库的 django 管理员。
- 所有数据库都应该适用于 models.py 中定义的所有模型(完整的 django 管理项目)。
- 应从url中选择数据库
- 如果解决方案不需要每次我们添加新数据库时都重新启动服务器...更好。
例子:
www.domainname.com/customerA --> Complete Django admin with Database A
www.domainname.com/customerB --> Complete Django admin with Database B
www.domainname.com/customerC --> Complete Django admin with Database C
现在,尝试第一种方法,我有一个 middleware.py 文件,其中包含:
request_cfg = threading.local()
class MyProjectMiddleware:
def __call__(self, request):
request_cfg.URL_MAIN_WORD = request.build_absolute_uri().split("/")[3]
response = self.get_response(request)
return response
class MyProjectDatabaseRouter(object):
def _default_db( self ):
if hasattr( request_cfg, 'URL_MAIN_WORD' ):
return request_cfg.URL_MAIN_WORD
else:
#this will be an error throwing situation.
return 'default'
def db_for_read( self, model, **hints ):
return self._default_db()
def db_for_write( self, model, **hints ):
return self._default_db()
然后,在 urls.py 中:
from django.conf.urls import url, include
from django.contrib import admin
from django.conf import settings
urlpatterns = [
url(r'^customerA/' , admin.site.urls),
url(r'^customerB/' , admin.site.urls),
url(r'^customerC/' , admin.site.urls)
]
这或多或少有效,但是....
django admin 上的所有链接都指向 www.domainname.com/customerA。
我认为这是因为他们使用“相同”的反向方法来获取链接,而不是从当前 url 组合它们。
Any of this urls seem to read from correct database:
www.domainname.com/customerB/...
But results have links pointing to first one:
www.domainname.com/customerA/...
我希望我解释得很好……这很复杂。
有什么超脑能帮我解决这个问题吗?
提前致谢。
【问题讨论】:
标签: python django database django-admin