2013-08-19 20 views
55

Próbuję utworzyć oprogramowanie pośrednie, aby opcjonalnie przekazać kwarg do każdego widoku spełniającego warunek.konfiguracja niestandardowego oprogramowania pośredniego w django

Problem polega na tym, że nie mogę znaleźć przykładu konfiguracji oprogramowania pośredniego. Widziałem klasy, które nadpisują metodę, którą chcę, process_view:

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

     return None 

Ale gdzie mam umieścić tę klasę? Czy tworzę aplikację middleware i umieszczam w niej tę klasę, a następnie odwołuję się do niej w settings.middleware?

+2

Możesz śledzić jednego z moich odpowiedzi tutaj: http://stackoverflow.com/questions/17751163/django-display-time-it-took-to-load -a-page-on-every-page/17777539 # 17777539 –

+0

Mimo że jest to świetna odpowiedź, możesz także śledzić [książkę django] (http://www.djangobook.com/en/2.0/chapter17.html) – karthikr

+0

możesz to zrobić: http://stackoverflow.com/questions/17751163/django-display-time-it-took-to-load-a-page-on-every-page/17777539#17777539 – Atma

Odpowiedz

87

pierwsze: Ścieżka struktura

Jeśli nie masz to trzeba stworzyć folderu middleware wewnątrz aplikacji zgodnie ze strukturą:

yourproject/yourapp/middleware 

Folder middleware powinny być umieszczone w tym samym folderze co settings.py, adresy URL, szablony ...

Ważne: nie zapomnij o utworzeniu __init__.py e Plik mpty wewnątrz folderu middleware więc Twoja aplikacja rozpozna ten folder

drugie: Tworzenie middleware

Teraz musimy utworzyć plik dla naszego niestandardowego oprogramowania pośredniczącego, w tym przykładzie załóżmy supose chcemy middleware czy filtr użytkowników na podstawie ich adresu IP, możemy utworzyć plik o nazwie filter_ip_middleware.py wewnątrz middleware folderze z tym kodem:

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 

trzecie: Dodaj middleware w naszej 'settings.py'

Musimy szukać:

  • MIDDLEWARE_CLASSES(django < 1.10)
  • MIDDLEWARE(Django> = 1,10)

Wewnątrz settings.py i tam trzeba dodać nasze oprogramowanie pośrednie (Dodaj go na ostatniej pozycji). Powinno być takie:

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

Zrobione! Teraz każde żądanie od każdego klienta wywoła Twoje niestandardowe oprogramowanie pośrednie i przetworzy Twój niestandardowy kod!

+2

Pomogło to, precyzyjne ! :) – Sharath

+0

Czy ścieżka do pliku jest właściwa? Czy nie powinien to być twój projekt/twoja aplikacja/oprogramowanie pośredniczące? – tiagovrtr

+0

Tak @tiagovrtr ścieżką powinna być 'twoja_projekt/twoja_plik/middleware'. Zakładam, że to było dość oczywiste, ale zaktualizuję je, jeśli to usunie. – AlvaroAV

-1

Będzie to pomocne w przypadku Kiedy wiesz, jaki typ wyjątku występuje w widokach. Z powyższego Stworzyłem własną niestandardową klasę jak

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" 

zostanie wykonany, gdy wyjątek występuje w przypadku strun i całkowitej dodatkowo.

Możesz napisać analogicznym widoki dla powyższego klasy middleware