como configurar o middleware personalizado em django
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 ?
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 !
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',
...
]
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