web-dev-qa-db-fra.com

Comment configurer un middleware personnalisé dans Django

J'essaie de créer un middleware pour éventuellement passer un kwarg à chaque vue qui remplit une condition.

Le problème est que je ne trouve pas d'exemple de configuration du middleware. J'ai vu des classes qui remplacent la méthode que je veux, process_view:

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

        return None  

Mais où dois-je mettre cette classe? Dois-je créer une application middleware et y mettre cette classe, puis la référencer dans settings.middleware?

65
Atma

Premièrement: la structure du chemin

Si vous ne l'avez pas, vous devez créer le dossier middleware dans votre application en suivant la structure:

yourproject/yourapp/middleware

Le middleware de dossier doit être placé dans le même dossier que settings.py, urls, templates ...

Important: N'oubliez pas de créer le fichier vide __init__.py dans le dossier middleware pour que votre application reconnaisse ce dossier

Deuxièmement: créer le middleware

Maintenant, nous devons créer un fichier pour notre middleware personnalisé, dans cet exemple supposons que nous voulons un middleware qui filtre les utilisateurs en fonction de leur IP, nous créons un fichier appelé filter_ip_middleware.py à l'intérieur du middleware dossier avec ce code:

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

Troisièmement: Ajoutez le middleware dans notre 'settings.py'

Nous devons rechercher:

  • MIDDLEWARE_CLASSES (Django <1.10)
  • MIDDLEWARE (Django> = 1.10)

À l'intérieur de settings.py et là, nous devons ajouter notre middleware ( Ajoutez-le à la dernière position ). Cela devrait être comme:

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

Terminé! Maintenant, chaque demande de chaque client appellera votre middleware personnalisé et traitera votre code personnalisé!

115
AlvaroAV

Juste deux étapes. Cela fonctionne pour moi avec Django2.1.

1.Créez votre propre classe Middleware.

Il y a une bonne démo du manuel officiel.

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.Référencez votre classe Middleware dans la liste MIDDLEWARE de votre projet setting.py fichier.

La règle de référence du middleware est le chemin d'accès à votre classe à partir du répertoire racine de votre projet.

Par exemple, dans un projet nommé mysite, l'arborescence est la suivante.

├── mysite
│   ├── manage.py
│   ├── mysite
│   │   ├── __init__.py
│   │   ├── middleware.py
│   │   ├── settings.py
│   │   ├── urls.py
│   │   └── wsgi.py

Nous ajoutons simplement notre classe Middleware MultipleProxyMiddleware dans le middleware.py fichier. Nous obtenons le nom de référence suivant.

MIDDLEWARE = [
    'mysite.middleware.MultipleProxyMiddleware',  
     ...
]
3
W.Perrin