根据django中的请求动态设置数据库 [英] dynamically set database based on request in django

查看:1787
本文介绍了根据django中的请求动态设置数据库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用python-django编写一个多租户应用程序。



我想根据每个请求设置数据库连接。我以为我可以写一个中间件我们设置要用于该特定数据库的数据库。

  import d 
from django.db import connections

class SetTenantDatabase(object):
def process_request(self,request):
pattern = re.compile(\\b(http:// | https:// | www。| .com | 8000 |:| //)\\W\\d +,re.I)
words = request.get_host()
db_name = [pattern。 sub(,words)] [0] .split('。')[0]
connections.databases ['new-alias'] = {
'default':{
'ENGINE':'django.db.backends.postgresql_psycopg2',
'NAME':'store1',
'USER':'xxx',
'PASSWORD':'xxx'
'HOST ':'127.0.0.1',
}
}
conn = connections ['new-alias']
return无
/ pre>

但这不工作。我该怎么办这个方法错了或解决方案可行,最后是怎么样?

解决方案

这是答案,希望将来可以帮助某人:

  import re 
import threading
request_cfg = threading.local()


class RouterMiddleware(object):
def process_request(self,请求):
pattern = re.compile(\\b(http:// | https:// | www。| .com | 8000 |:| //)\\W\ \d +,re.I)
words = request.get_host()
db_name = [pattern.sub(,words)] [0] .split('。')[0]
request_cfg.cfg = db_name
return None

def process_response(self,request,response):
if hasattr(requ est_cfg,'cfg'):
del request_cfg.cfg
返回响应


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, **提示)
return self._default_db()

def db_for_write(self,model,** hints):
return self._default_db()

谢谢


I am writing a multi-tenant application with python-django.

I want to set database connection based on each request.I thought i could write a middleware where we set the database to be used for that particular database.

import re
from django.db import connections

class SetTenantDatabase(object):
    def process_request(self, request):
        pattern = re.compile("\\b(http://|https://|www.|.com|8000|:|//)\\W\\d+", re.I)
        words = request.get_host()        
        db_name = [pattern.sub("", words)][0].split('.')[0]
        connections.databases['new-alias'] = { 
        'default': {
                    'ENGINE': 'django.db.backends.postgresql_psycopg2',
                    'NAME': 'store1',
                    'USER': 'xxx',
                    'PASSWORD': 'xxx',
                    'HOST': '127.0.0.1',
    } 
                                              }
        conn = connections['new-alias']
        return None

but this is not working.How should i do this.Is the approach wrong or is the solution feasible, and lastly How?

解决方案

this is the answer, hope it helps someone in future:

import re
import threading 
request_cfg = threading.local()


class RouterMiddleware(object):
    def process_request( self, request):
        pattern = re.compile("\\b(http://|https://|www.|.com|8000|:|//)\\W\\d+", re.I)
        words = request.get_host()        
        db_name = [pattern.sub("", words)][0].split('.')[0]
        request_cfg.cfg = db_name
        return None

    def process_response( self, request, response ):
        if hasattr( request_cfg, 'cfg' ):
            del request_cfg.cfg
        return response


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

Thanks

这篇关于根据django中的请求动态设置数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆