我现在有以下中间件:
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
我怎样才能做到呢?
发布于 2017-03-18 04:05:38
如果您不需要未经修改的环境密钥,只需在该特定路由上使用一个装饰器,并将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/'
或者,如果您必须使用中间件(或者如果您想配置在运行时记录的路由,而不是构建时),您只需查看PATH_INFO
,并仅在路径匹配时进行日志记录:
if environ.get('PATH_INFO') in ('/foo/', '/bar'):
keys = # ... snip ...
return self._app(environ, resp)
https://stackoverflow.com/questions/42864788
复制相似问题