django中间件错误 [英] Error with django middleware

查看:123
本文介绍了django中间件错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图借助中间件(在threading.local中设置变量)和dbrouter(根据在threading.local中设置的变量设置数据库)动态选择数据库.

I am trying to select database dynamically with help of a middleware(which sets a variable in threading.local) and a dbrouter(which sets the database depending upon the variable set in 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列表如下:

My List of middleware_classes goes like this:

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',
)

但是中间件还是有问题的,就像进行登录(请求,用户)一样,用户也没有在请求中设置,即用户仍然是匿名用户.

But there is something wrong with the middleware.Like even after doing login(request, user), the user is not set in request, i.e user is still anonymous one.

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

Removing the middleware solves my problem i.e user gets set in request.

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

Hopefully there is something wrong with middleware, but i cant figure out what! please tell me whats wrong about this code.Thanks.

推荐答案

只使用post_request,更明确地讲,删除

just use post_request, more explicitly, remove

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

def process_request(self, request):
##

可以.

这篇关于django中间件错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆