我试图在中间件(在threading.local中设置变量)和dbrouter(根据threading.local中设置的变量设置数据库)的帮助下动态选择数据库。
代码继续这样:
import re
import threading
request_cfg = threading.local()
class RouterMiddleware(object):
def process_view( self, request, view_func, view_args, view_kwargs ):
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()
我的middleware_classes列表如下:
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'subdomains.middleware.SubdomainURLRoutingMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'oscar.apps.basket.middleware.BasketMiddleware',
'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
'catalogue.middleware.RouterMiddleware',
)
但是中间件有问题。即使在登录(请求,用户)之后,用户也没有设置请求,即用户仍然是匿名用户。
删除中间件解决了我的问题,即用户在请求中被设置。
希望中间件出现问题,但我无法弄清楚是什么!请告诉我这个代码有什么不对。谢谢。
答案 0 :(得分:1)
只需使用post_request,更明确地说,删除
def process_view( self, request, view_func, view_args, view_kwargs ):
##
带
def process_request(self, request):
##
将会这样做。