2017-03-17 13 views
1

にフラスコロギングミドルウェアを適用し、私は今、次のミドルウェアを持っている:は1つのビューのみ

私は経由でインストール
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) 

:これは私のアプリケーションで扱うすべての単一の要求をログに記録します

app.wsgi_app = LoggingMiddleware(app.wsgi_app) 

。この範囲を1つのビュー関数に限定したいのですが、

どうすればいいですか?

答えて

0

あなたが変更されていない環境のキーを必要としない場合environrequest.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 

それからちょうどログデコレータであなたが気に1つのルートをラップ:あなたはミドルウェアを使用する必要がある場合(実行時に記録されますどのルート設定ではなく、時間を構築したい場合は)

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

あるいは、あなただけ見ることができますt PATH_INFOとなり、パスが次のパスに一致する場合のみログに記録されます。

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

return self._app(environ, resp) 
関連する問題