【问题标题】:Error with django middlewaredjango 中间件出错
【发布时间】:2014-12-12 07:01:25
【问题描述】:

我正在尝试借助中间件(在 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',
)

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

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

希望中间件有问题,但我不知道是什么问题!请告诉我这段代码有什么问题。谢谢。

【问题讨论】:

  • 请在settings.py中分享MIDDLEWARE_CLASSES的列表
  • 请查看更新后的问题@sax

标签: python django django-middleware


【解决方案1】:

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

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

def process_request(self, request):
##

这样就可以了。

【讨论】:

  • 我在这里发现的有趣的是 OP 名称和答案的名称相同!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-29
  • 2017-07-03
相关资源
最近更新 更多