django中间件出错

时间:2014-12-12 07:01:26

标签: python django django-middleware

我试图在中间件(在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',
)

但是中间件有问题。即使在登录(请求,用户)之后,用户也没有设置请求,即用户仍然是匿名用户。

删除中间件解决了我的问题,即用户在请求中被设置。

希望中间件出现问题,但我无法弄清楚是什么!请告诉我这个代码有什么不对。谢谢。

1 个答案:

答案 0 :(得分:1)

只需使用post_request,更明确地说,删除

def process_view( self, request, view_func, view_args, view_kwargs ):
##

def process_request(self, request):
##

将会这样做。