2013-08-19 3 views
55

Я пытаюсь создать промежуточное программное обеспечение, чтобы по желанию передать kwarg для каждого представления, которое соответствует условию.Как настроить настраиваемое промежуточное ПО в django

Проблема в том, что я не могу найти пример настройки промежуточного программного обеспечения. Я видел классы, которые переопределяют метод, который я хочу, process_view:

Class CheckConditionMiddleware(object): 
    def process_view(self, request): 

     return None 

Но где я могу поместить этот класс? Я создаю приложение промежуточного программного обеспечения и помещаю его в него, а затем ссылаюсь на него в settings.middleware?

+2

Вы можете следить за одним из моих ответов здесь: http://stackoverflow.com/questions/17751163/django-display-time-it-took-to-load -a-page-on-all-page/17777539 # 17777539 –

+0

Хотя это отличный ответ, вы также можете следить за [django book] (http://www.djangobook.com/en/2.0/chapter17.html) – karthikr

+0

вы можете сделать это: http://stackoverflow.com/questions/17751163/django-display-time-it-took-to-load-a-page-on-every-page/17777539#17777539 – Atma

ответ

87

Первый: Путь Структура

Если вы не имеете его нужно создать папкупромежуточного слоя в вашем приложении следующие структур:

yourproject/yourapp/middleware 

Промежуточная папки должны быть размещены в той же папке, что и settings.py, urls, templates ...

Важно: Не забудьте создать __init__.py e MPTY файл в папке промежуточного слоя, так ваше приложение распознать эту папку

Второе: Создать промежуточный

Теперь мы должны создать файл для нашего самодельного промежуточного слоя, в этом примере давайте supose мы хотим промежуточный уровень, что фильтровать пользователь на основе их IP, мы создаем файл с именем filter_ip_middleware.py внутри промежуточного папки с этим кодом:

class FilterIPMiddleware(object): 
    # Check if client IP is allowed 
    def process_request(self, request): 
     allowed_ips = ['192.168.1.1', '123.123.123.123', etc...] # Authorized ip's 
     ip = request.META.get('REMOTE_ADDR') # Get client IP 
     if ip not in allowed_ips: 
      raise Http403 # If user is not allowed raise Error 

     # If IP is allowed we don't do anything 
     return None 

Третье: Добавить к промежуточному в нашем «settings.py»

Нам нужно искать:

  • MIDDLEWARE_CLASSES(Джанго < 1.10)
  • MIDDLEWARE(Джанго> = 1,10)

Внутри settings.py и там необходимо добавить наше промежуточное ПО (Добавить его в последнюю позицию). Он должен быть следующим:

MIDDLEWARE = (# Before Django 1.10 the setting name was 'MIDDLEWARE_CLASSES' 
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    # Above are django standard middlewares 

    # Now we add here our custom middleware 
    'yourapp.middleware.filter_ip_middleware.FilterIPMiddleware' 
) 

Выполнено! Теперь каждый запрос от каждого клиента вызовет ваше собственное промежуточное ПО и обработает ваш код!

+2

Это помогло, точнее ! :) – Sharath

+0

Правильно ли путь к файлу? Разве это не ваш проект/yourapp/middleware? – tiagovrtr

+0

Да @tiagovrtr путь должен быть 'yourproject/yourapp/middleware'. Я предположил, что это было довольно очевидно, но я обновлю его, если это очистит вас – AlvaroAV

-1

Это будет полезно в случае, когда вы знаете, какой тип исключения возникает в представлениях. Исходя из вышеизложенного, я создал свой собственный класс, как

from .models import userDetails 

class customMiddleware(object): 

    def process_request(self,request): 
     result='' 
     users = userDetails.objects.all() 
     print '-->',users ,'---From middleware calling ---' 

     username=request.POST.get("username") 
     salary = request.POST.get("salary") 
     if salary: 
      try: 
       result = username+int(salary) 
      except: 
       print "Can't add" 

Он будет выполняться, когда исключение происходит в случае строки и целочисленного сложения.

Вы можете написать корреспондент представление для выше промежуточного класса