como configurar o middleware personalizado em django

Estou a tentar criar middleware para, opcionalmente, passar um kwarg para todas as vistas que satisfaçam uma condição.

o problema é que não consigo encontrar um exemplo de como configurar o middleware. Eu vi classes que sobrepõem o método que eu quero, process_view:

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

        return None  
Mas onde ponho esta aula? Se eu crio um aplicativo de middleware e coloco esta classe dentro dele e, em seguida, referenciá-lo nas Configurações.middleware ?

Author: Serjik, 2013-08-20

3 answers

Primeiro: a estrutura do caminho

Se não o tiver, terá de criar a pasta middleware dentro da sua aplicação, seguindo a estrutura:

yourproject/yourapp/middleware

o middleware da pasta deve ser colocado na mesma pasta que settings.py, urls, modelos...

Importante: não se esqueça de criar o __ _ init__.py esvaziar o ficheiro dentro da pasta middleware para que a sua aplicação reconheça esta pasta

Segundo: criar o middleware

Agora nós deverá criar um ficheiro para o nosso middleware personalizado, neste exemplo suponhamos que queremos um middleware que filtre os utilizadores com base no seu IP, criamos um ficheiro chamado filter_ip_middleware.py dentro da pasta middleware com este código:
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
Terceiro: adicione o middleware no nosso 'settings.py" [7]} Temos de procurar por:
  • MIDDLEWARE_CLASSES (django
  • MIDDLEWARE (django > = 1,10)

Dentro do settings.py e aí precisamos adicionar nosso middleware ([[13]}adicioná-lo na última posição ). Deve ser do tipo:

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

Feito !Agora cada pedido de cada cliente irá ligar para o seu middleware personalizado e processar o seu código personalizado !

 98
Author: AlvaroAV, 2017-07-30 08:34:18
Só dois passos. Funciona comigo.

1.Crie a sua própria classe de Middleware.

Há uma boa demonstração do manual oficial.

Https://docs.djangoproject.com/en/2.1/ref/request-response/#django.http.HttpRequest.get_host

    from django.utils.deprecation import MiddlewareMixin

    class MultipleProxyMiddleware(MiddlewareMixin):
        FORWARDED_FOR_FIELDS = [
            'HTTP_X_FORWARDED_FOR',
            'HTTP_X_FORWARDED_HOST',
            'HTTP_X_FORWARDED_SERVER',
        ]

        def process_request(self, request):
            """
            Rewrites the proxy headers so that only the most
            recent proxy is used.
            """
            for field in self.FORWARDED_FOR_FIELDS:
                if field in request.META:
                    if ',' in request.META[field]:
                        parts = request.META[field].split(',')
                        request.META[field] = parts[-1].strip()

2.Faça referência à sua classe de Middleware na lista MIDDLEWARE do seu ficheiro do projecto setting.py.

A regra para a referência Middleware é o caminho para a sua classe A partir da raiz directório do seu projecto.

Por exemplo,num projecto chamado mysite, a árvore é a seguinte.

├── mysite
│   ├── manage.py
│   ├── mysite
│   │   ├── __init__.py
│   │   ├── middleware.py
│   │   ├── settings.py
│   │   ├── urls.py
│   │   └── wsgi.py
Só adicionamos a nossa classe de Middleware no ficheiro middleware.py. Temos o seguinte nome de referência.
MIDDLEWARE = [
    'mysite.middleware.MultipleProxyMiddleware',  
     ...
]
 0
Author: W.Perrin, 2018-08-27 14:52:50

Será útil no caso de saber que tipo de excepção ocorre nas vistas. Do acima eu criei minha própria classe personalizada como

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"

Será executado quando a excepção ocorrer no caso de string e adição de inteiros.

Você pode escrever as vistas correspondentes para a classe de middleware acima

 -2
Author: user6061091, 2017-01-26 15:43:21