Я пытаюсь решить что-то, что является довольно трудным для меня, и у меня слишком много головной боли.
Я хочу иметь одного администратора 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 являются pointint всегда 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/...
I надеюсь, я хорошо объяснил ... довольно сложно.
Любой супер-мозг может помочь мне решить эту проблему?
Th Анки заранее.