Может ли Django использовать одну и ту же ссылку и базу данных для каждого клиента? - PullRequest
0 голосов
/ 06 июня 2018

Может ли Django использовать одну и ту же ссылку и базу данных для каждого клиента?

Здравствуйте, я новичок в Django и у меня есть вопрос.Я привожу систему PHP в Django, где все клиенты используют одну и ту же ссылку для доступа к системе, но каждый со своей базой данных с пользователями, группами доступа и т. Д. На пользовательском экране входа в систему они сообщают свой идентификатор клиента, пользователя и пароль для аутентификации.где всегда идентификатор клиента - это имя базы данных.

Я сделал следующий код, чтобы изменить подключение к базе данных, что, вероятно, неверно:

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

Код даже обменивается с базой данных.хотите получить доступ, но при тестировании на моем локальном компьютере с помощью сервера запуска, если другой клиент обращается одновременно, например, в другом браузере, он вытесняет другого клиента.

Кто-нибудь имел его или у него есть идея для решения?Я искал маршрутизаторы, я не знаю, смогу ли я решить мою проблему, или была ли та же самая проблема переключения соединения и удаления другого клиента.

Благодарен.

Ответы [ 2 ]

0 голосов
/ 17 июля 2018

Я думаю, что решил свою проблему, я нашел очень полезную для меня ссылку:

динамически устанавливаемая база данных на основе запроса в django

Используетсяпромежуточное программное обеспечение для получения соединения и маршрутизатора, как было упомянуто ответившим персоналом, который в случае, если он принимает поддомен, я внес в него некоторые изменения, чтобы получить префикс, который уже решает мой случай, с помощью этой ссылки:

Django URL с динамическим префиксом

Следуйте коду:

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

Спасибо всем, кто пытался мне помочь :)

0 голосов
/ 06 июня 2018

Согласно документации, вы не должны редактировать settings.py во время выполнения, но вы пробовали this ?

...