我试图在中间件(在 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 = (
'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',
)
但是中间件有问题。即使在登录(请求,用户)之后,用户也没有在请求中设置,即用户仍然是匿名用户。
删除中间件解决了我的问题,即用户在请求中被设置。
希望中间件有问题,但我不知道是什么问题!请告诉我这段代码有什么问题。谢谢。
最佳答案
只需使用 post_request,更明确地说,删除
def process_view( self, request, view_func, view_args, view_kwargs ):
##
与
def process_request(self, request):
##
这样就可以了。
关于python - django中间件错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27438498/