根据django中的请求动态设置数据库 [英] dynamically set database based on request in django
本文介绍了根据django中的请求动态设置数据库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想根据每个请求设置数据库连接。我以为我可以写一个中间件我们设置要用于该特定数据库的数据库。
import d
/ pre>
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无
但这不工作。我该怎么办这个方法错了或解决方案可行,最后是怎么样?
解决方案这是答案,希望将来可以帮助某人:
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屋!
查看全文