Django multiple database

33 Views Asked by At

I'm using two same structure database in Django:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'database1',
        'USER': 'root',
        'PASSWORD': '',
        'HOST': 'localhost',
        'PORT': '3306'
    },
    'db_1402': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'database2',
        'USER': 'root',
        'PASSWORD': '',
        'HOST': 'localhost',
        'PORT': '3306'
    }
}

and user select a database in login page. I want to use user selected database in whole project and all Models read and write in user selected database. I try to use database router but user logout automatically. I define bellow decorator to save database name in connections['default'].alias and pass it to database router:

from django.db import connections
def db_login_required(login_url):
    def decorator(view):
        def wrapper_func(request, *args, **kwargs):
            if not request.user.is_authenticated:
                next_url = request.get_full_path()
                return redirect(f'{reverse(login_url)}?{urlencode({"next": next_url})}')
            connections['default'].alias = request.session.get('database', 'default')
            return view(request, *args, **kwargs)

        return wrapper_func

    return decorator

and then I create a database router like this:

class SessionDatabaseRouter(object):
    def db_for_read(self, model, **hints):
        return connections['default'].alias

    def db_for_write(self, model, **hints):
        return connections['default'].alias

    def allow_relation(self, obj1, obj2, **hints):
        return True

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        return True

but after login suddenly user logout automatically. How can fix this?

0

There are 0 best solutions below