2014-12-12 4 views
1

Я пытаюсь выбрать базу данных динамически с помощью промежуточного программного обеспечения (которое устанавливает переменную в threading.local) и dbrouter (который устанавливает базу данных в зависимости от переменной, заданной в threading.local).Ошибка с промежуточным программным обеспечением django

Код продолжается так:

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

Но есть что-то не так с middleware.Like даже после выполнения входа (запрос, пользователь), пользователь не установлен в запросе, то есть пользователь по-прежнему анонимный.

Удаление промежуточного программного обеспечения решает мою проблему. I.e пользователь получает заданный запрос.

Надеюсь, что-то не так с промежуточным ПО, но я не могу понять, что! скажите, пожалуйста, что случилось с этим кодом. Спасибо.

+0

, пожалуйста, поделитесь списком 'MIDDLEWARE_CLASSES' в' settings.py' – sax

+0

См. Обновленный вопрос @sax –

ответ

1

просто использовать post_request, более явно, удалить

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

с

def process_request(self, request): 
## 

, что будет делать.

+0

Забавная вещь, которую я нашел здесь, - это имя OP, и имя ответа одинаково! –

Смежные вопросы

 Смежные вопросы