2017-03-17 16 views
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) 

這將記錄在我的應用程序來處理每一個請求。我想限制這個範圍只有一個查看功能,

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

我該怎麼做?

回答

0

如果您不需要未修飾的環境下按鍵,只需使用一個裝飾針對特定路線,並environ關閉的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 

然後,只需包裝在日誌裝飾您所關心的一個途徑:

@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)