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
?
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
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
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é!
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',
...
]