2017-03-17 1 views
1

J'ai le middleware suivant en ce moment:middleware d'enregistrement Flask à une seule vue

class LoggingMiddleware(object): 
    def __init__(self, app): 
    self._app = app 

    def __call__(self, environ, resp): 
    keys = ['HTTP_ACCEPT', 'HTTP_ACCEPT_ENCODING', 
      'HTTP_X_FORWARDED_FOR', 'HTTP_REFERER', 
      'HTTP_USER_AGENT', 'PATH_INFO', 
      'QUERY_STRING', 'REMOTE_ADDR'] 
    dumpable = { k:environ.get(k, None) for k in keys } 
    print json.dumps(dumpable)  # Not sure how to get this to work with papertrail 
    return self._app(environ, resp) 

que j'installe via:

app.wsgi_app = LoggingMiddleware(app.wsgi_app) 

Enregistre chaque demande traitée par ma demande. Je voudrais limiter cette portée à une seule fonction de vue,

@app.route('/foo/') 
def foo 

Comment puis-je faire?

Répondre

0

Si vous ne avez pas besoin des clés de l'environnement non modifié, il suffit d'utiliser un décorateur pour cet itinéraire particulier et obtenir environ hors de request.environ:

def log_request(route): 
    @functools.wraps(route) 
    def wrapper(*args, **kwargs): 
     keys = ['HTTP_ACCEPT', 'HTTP_ACCEPT_ENCODING', 
     'HTTP_X_FORWARDED_FOR', 'HTTP_REFERER', 
     'HTTP_USER_AGENT', 'PATH_INFO', 
     'QUERY_STRING', 'REMOTE_ADDR'] 
     dumpable = { k:environ.get(k, None) for k in keys } 

     # TODO: Log elsewhere 
     print(json.dumps(dumpable)) 
     return route(*args, **kwargs) 

    return wrapper 

Ensuite, il suffit envelopper la seule route que vous aimez dans un décorateur d'exploitation forestière :

@app.route('/foo/') 
@log_request 
def foo(): 
    return 'hello from /foo/' 

Alternativement, si vous devez utiliser un middleware (ou si vous voulez configurer les itinéraires journalisé au moment de l'exécution, plutôt que de construire le temps), vous pouvez juste regarder un t PATH_INFO et consigner uniquement si le chemin correspond:

if environ.get('PATH_INFO') in ('/foo/', '/bar'): 
    keys = # ... snip ... 

return self._app(environ, resp)