pylons middleware

Une application web à des fois besoin d'exécuter une tâche particulière à toutes les requêtes utilisateur ou réponses serveur (request / response). ce processus est appelé middleware. l'avantage avec les middlewares c'est qu'on peut ajouter des fonctionnalités à tout le projet sans toucher au code des vues.

Parmi les utilisations les plus communes des middlewares c'est la compression des réponses serveur, la gestion des autorisations, les logs ...

En Pylons l'ajout d'un middleware se fait depuis le fichier /config/middleware.py :

def make_app(global_conf, full_stack=True, static_files=True, **app_conf):
 
# Configure the Pylons environment
load_environment(global_conf, app_conf)
 
# The Pylons WSGI app
app = PylonsApp()
 
# Routing/Session/Cache Middleware
app = RoutesMiddleware(app, config['routes.map'])
app = SessionMiddleware(app, config)
app = CacheMiddleware(app, config)
 
# CUSTOM MIDDLEWARE HERE (filtered by error handling middlewares)
app = MonMiddleware(app)
...

Dans l'exemple, notre classe MonMiddleware s'instancie avec un seul paramètre représentant l'application en cour.

Prenons le cas où on voudrais ajouter une detection de pays dans chaque requête utilisateur et logger les requêtes en dehors d'une liste de pays.

#dans le fichier lib/utils.py ajouter le code:
import urllib2
def get_country(ip):
""" retourne le pays à partir d'une adresse ip """
result = urllib2.urlopen(url="http://api.wipmania.com/%s" % ip)
if result.status_code == 200:
return result.content
else:
get_country(ip)
 
#dans le fichier lib/middleware.py ajouter le code:
from monapp.lib.utils import get_country
import logging
 
log = logging.getLogger(__name__)
 
class MonMiddleware(object):
def __init__(self, app):
self.app = app
 
def __call__(self, environ, start_response):
country = get_country(environ['REMOTE_ADDR'])
if not country in ['FR', 'MA', 'TU']:
log.warning('un utilisateur venant de %s essai d\'acceder a la page %s' % (country, environ['PATH_INFO']))
return self.app(environ, start_response)

et le tour est joué, maintenant on est plus obligé de faire le test à chaque fois et ça sera aussi intégré dans les futurs vues de l'application. à noter que MonMiddleware s'instancie une seul fois, et à chaque requête utilisateur c'est la fonction call qui est appellé. (la fonction actuelle doit être optimisé pour tester que les nouvelles IP)

Bonne année :)

Ajouter un commentaire

Nom :*
Email :*
Site perso :
Commentaire :*
chargement