python - mw_instance - django custom middleware typeerror object() takes no parameters
cómo configurar middleware personalizado en django (3)
Estoy intentando crear middleware para pasar opcionalmente un kwarg a cada vista que cumpla una condición.
El problema es que no puedo encontrar un ejemplo de cómo configurar el middleware. He visto clases que anulan el método que deseo, process_view:
Class CheckConditionMiddleware(object):
def process_view(self, request):
return None
¿Pero dónde pongo esta clase? ¿Creo una aplicación de middleware y coloco esta clase dentro de ella y luego la hago referencia en settings.middleware?
Primero: La estructura del camino.
Si no lo tiene, debe crear la carpeta de middleware dentro de su aplicación siguiendo la estructura:
yourproject/yourapp/middleware
La carpeta de middleware se debe colocar en la misma carpeta que settings.py, urls, templates ...
Importante: no olvide crear el archivo vacío __init__.py dentro de la carpeta de middleware para que su aplicación reconozca esta carpeta
Segundo: Crea el middleware.
Ahora deberíamos crear un archivo para nuestro middleware personalizado, en este ejemplo supongamos que queremos un middleware que filtre a los usuarios según su IP, creamos un archivo llamado filter_ip_middleware.py dentro de la carpeta del middleware con 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
Tercero: Agregue el middleware en nuestro ''settings.py''
Necesitamos buscar:
-
MIDDLEWARE_CLASSES
(django <1.10) -
MIDDLEWARE
(django> = 1.10)
Dentro de settings.py y allí debemos agregar nuestro middleware (agregarlo en la última posición ). Debería ser como
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''
)
Hecho ! Ahora, cada solicitud de cada cliente llamará a su middleware personalizado y procesará su código personalizado.
Será útil en el caso de Cuando sepa qué tipo de excepción se produce en las vistas. De lo anterior he creado mi propia clase 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"
Se ejecutará cuando se produzca la excepción en el caso de la adición de cadenas y enteros.
Puede escribir vistas correspondientes para la clase de middleware anterior.
Solo dos pasos. Funciona para mi con django2.1
.
1.Crea tu propia clase de middleware.
Hay una buena demostración del 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.Referencia su clase de Middleware en la lista de MIDDLEWARE
de su archivo de MIDDLEWARE
de proyecto.py.
La regla para la referencia de Middleware es la ruta a su clase desde el directorio raíz de su proyecto.
Por ejemplo, en un proyecto llamado mysite
, el árbol es el siguiente.
├── mysite
│ ├── manage.py
│ ├── mysite
│ │ ├── __init__.py
│ │ ├── middleware.py
│ │ ├── settings.py
│ │ ├── urls.py
│ │ └── wsgi.py
Simplemente agregamos nuestra clase de Middleware MultipleProxyMiddleware
en el archivo middleware.py
. Obtenemos el siguiente nombre de referencia.
MIDDLEWARE = [
''mysite.middleware.MultipleProxyMiddleware'',
...
]