Gids voor het Implementeren van een Aangepaste Middleware in Django voor Verbeterde Verzoekverwerking
description
Het maken van aangepaste middleware biedt betere controle over verzoekverwerking, verbeterde prestaties en de mogelijkheid om cross-cutting concerns zoals logging en authenticatie efficiënt te implementeren.
prompt
try_prompt
Help me bij het ontwerpen en implementeren van een aangepaste middleware in mijn Django-toepassing om verzoeken en antwoorden te onderscheppen en te wijzigen. Besc ... more
generate_helper
...
ai_answers
provider: openai
model: gpt-4.1-nano
Natuurlijk! Hier is een overzicht van hoe je huidige middleware-instelling eruit zou kunnen zien en hoe je een nieuwe middleware kunt implementeren om inkomende verzoeken te loggen voor monitoring:
Huidige Middleware-instelling (voorbeeld in settings.py):
```python
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
```
Wat je wilt bereiken met de nieuwe middleware:
- Alle inkomende HTTP-verzoeken onderscheppen.
- Details van deze verzoeken loggen (bijvoorbeeld methode, URL, headers, tijdstip).
- Mogelijk verdere verwerking of analyse mogelijk maken.
Implementatie van de aangepaste middleware:
1. Maak een nieuwe Python-module (bijvoorbeeld `middleware.py`) in je Django-app.
```python
import logging
from django.utils.deprecation import MiddlewareMixin
logger = logging.getLogger(__name__)
class LoggingMiddleware(MiddlewareMixin):
def process_request(self, request):
# Log relevante details van het verzoek
method = request.method
path = request.get_full_path()
headers = {k: v for k, v in request.headers.items()}
# Log het verzoek
logger.info(f"Inkomend verzoek: Methode={method}, Pad={path}, Headers={headers}")
```
2. Voeg de middleware toe aan je `settings.py`, bij voorkeur vóór de middleware die verzoeken verwerkt die afhankelijk zijn van deze logging:
```python
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'myapp.middleware.LoggingMiddleware', # Voeg hier je middleware toe
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
```
3. Zorg dat je logging goed is ingesteld in je `settings.py`, bijvoorbeeld:
```python
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'class': 'logging.StreamHandler',
},
},
'root': {
'handlers': ['console'],
'level': 'INFO',
},
}
```
Op deze manier onderschept je middleware alle inkomende verzoeken en logt hij de benodigde informatie voor monitoring. Wil je ook antwoorden loggen of verdere verwerking, dan kun je de middleware uitbreiden met methoden zoals `process_response`.
provider: deepseek
model: deepseek-chat
Hier is een gedetailleerde handleiding voor het ontwerpen en implementeren van een aangepaste middleware in Django voor het loggen van inkomende verzoeken:
## Huidige Middleware-instelling
Je huidige middleware-configuratie staat in `settings.py`:
```python
# settings.py
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
```
## Aangepaste Middleware implementeren
### Stap 1: Maak de middleware bestand
Maak een nieuw bestand `middleware.py` in je app-directory:
```python
# yourapp/middleware.py
import logging
import time
from django.utils.deprecation import MiddlewareMixin
# Logger instellen
logger = logging.getLogger('django.request')
class RequestLoggingMiddleware(MiddlewareMixin):
"""
Aangepaste middleware voor het loggen van inkomende verzoeken
"""
def process_request(self, request):
"""
Wordt uitgevoerd voor elk binnenkomend verzoek
"""
# Starttijd vastleggen voor respons tijd berekening
request.start_time = time.time()
# Log basis verzoek informatie
logger.info(
f"INKOMEND VERZOEK: {request.method} {request.path} "
f"| IP: {self.get_client_ip(request)} "
f"| User-Agent: {request.META.get('HTTP_USER_AGENT', 'Onbekend')}"
)
# Optioneel: log POST data (wees voorzichtig met gevoelige data)
if request.method == 'POST' and request.POST:
logger.debug(f"POST Data: {dict(request.POST)}")
return None
def process_response(self, request, response):
"""
Wordt uitgevoerd voor elk uitgaand antwoord
"""
# Bereken verwerkingstijd
if hasattr(request, 'start_time'):
process_time = time.time() - request.start_time
else:
process_time = 0
# Log respons informatie
logger.info(
f"RESPONS: {request.method} {request.path} "
f"| Status: {response.status_code} "
f"| Verwerkingstijd: {process_time:.2f}s "
f"| IP: {self.get_client_ip(request)}"
)
return response
def process_exception(self, request, exception):
"""
Wordt uitgevoerd bij exceptions
"""
logger.error(
f"EXCEPTIE: {request.method} {request.path} "
f"| Fout: {str(exception)} "
f"| IP: {self.get_client_ip(request)}"
)
return None
def get_client_ip(self, request):
"""
Haalt het echte client IP adres op
"""
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
if x_forwarded_for:
ip = x_forwarded_for.split(',')[0]
else:
ip = request.META.get('REMOTE_ADDR')
return ip
```
### Stap 2: Voeg middleware toe aan instellingen
Voeg je nieuwe middleware toe aan `settings.py`:
```python
# settings.py
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'yourapp.middleware.RequestLoggingMiddleware', # Jouw nieuwe middleware
]
```
### Stap 3: Configureer logging (optioneel)
Voor uitgebreidere logging, voeg toe aan `settings.py`:
```python
# settings.py
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'file': {
'level': 'INFO',
'class': 'logging.FileHandler',
'filename': 'django_requests.log',
},
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
},
},
'loggers': {
'django.request': {
'handlers': ['file', 'console'],
'level': 'INFO',
'propagate': False,
},
},
}
```
## Geavanceerde functionaliteiten
### Uitgebreide versie met meer details:
```python
# yourapp/middleware.py
import json
import logging
import time
from django.utils.deprecation import MiddlewareMixin
logger = logging.getLogger('django.request')
class AdvancedRequestLoggingMiddleware(MiddlewareMixin):
def process_request(self, request):
request.start_time = time.time()
log_data = {
'timestamp': time.strftime('%Y-%m-%d %H:%M:%S'),
'method': request.method,
'path': request.path,
'ip': self.get_client_ip(request),
'user_agent': request.META.get('HTTP_USER_AGENT', ''),
'user': str(request.user) if request.user.is_authenticated else 'Anoniem',
}
logger.info(f"VERZOEK: {json.dumps(log_data)}")
return None
def process_response(self, request, response):
process_time = time.time() - getattr(request, 'start_time', time.time())
# Voeg verwerkingstijd toe aan response headers (optioneel)
response['X-Process-Time'] = f'{process_time:.2f}s'
log_data = {
'timestamp': time.strftime('%Y-%m-%d %H:%M:%S'),
'method': request.method,
'path': request.path,
'status_code': response.status_code,
'process_time': f'{process_time:.2f}s',
'ip': self.get_client_ip(request),
}
logger.info(f"RESPONS: {json.dumps(log_data)}")
return response
def get_client_ip(self, request):
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
if x_forwarded_for:
ip = x_forwarded_for.split(',')[0].strip()
else:
ip = request.META.get('REMOTE_ADDR')
return ip
```
## Gebruik en monitoring
De middleware zal nu automatisch alle inkomende verzoeken loggen. Je kunt de logs vinden in:
- Console output tijdens ontwikkeling
- Het bestand `django_requests.log` (als geconfigureerd)
- Django's standaard logging systeem
Voorbeeld log output:
```
INFO:django.request:VERZOEK: {"timestamp": "2024-01-15 10:30:45", "method": "GET", "path": "/api/users/", "ip": "192.168.1.100", "user_agent": "Mozilla/5.0...", "user": "admin"}
INFO:django.request:RESPONS: {"timestamp": "2024-01-15 10:30:45", "method": "GET", "path": "/api/users/", "status_code": 200, "process_time": "0.15s", "ip": "192.168.1.100"}
```
Deze implementatie biedt een robuuste basis voor request monitoring en kan eenvoudig worden uitgebreid met aanvullende functionaliteiten zoals filtering, rate limiting, of specifieke business logic.

